之前发了一篇关于位移运算的文章,只讲了位运算符的一部分知识,然而在学数据结构与算法中的布隆过滤器的时候,感觉不够用了,所以查资料补全该方面知识,便于复习和加深记忆。
为什么会认为位运算难呢? (如果你是像我一样的新手,下面这段文字你值得一读!)
起初我也是感觉位运算超难,后来才发现它比一加一还简单,我认为难得原因在于,我并没有弄清楚他的操作对象是什么,就像人类可以理解的加减乘除,它的操作对象是十进制数,这很容易理解。对于位运算、位运算就好比是计算机的加减乘除,又因为计算机只认识由0、1组成的二进制数,所以位运算的操作对象顾名思义就是二进制数本身(下面有证明,绿色标记)。
目录
关键:在谈位运算符的时候,我们需要明白一个事情;位运算符的操作对象是什么?这很、非常、非常的关键!!!——————二进制数的各个位置上的0或1;
百度百科对于位运算符的操作对象给出一下结论:
了解了运算符的操作队对象后,接下来我们再去简单介绍一下什么是位运算符:
位运算符分为两种
位逻辑运算符
和位移运算符
。
首先说位逻辑运算符 :
此处有个加深记忆的方法——位逻辑运算符和逻辑运算符的不同:(最后展示)
这里编个口诀, “ 与 1 或 0 ” ,与的时候全为1结果才得1,或的时候全是0结果才是0;
再说位运算符:
位运算详解可以看这篇文章:
位逻辑运算计算过程演示:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A = 1100 0011
如何理解他们是如何操作的呢?下面我们介绍A&B是如何计算的,其他的也就自然而然明白了。
A = 0 0 1 1 1 1 0 0 |
B = 0 0 0 0 1 1 0 1 |
A&B = 0 0 0 0 1 1 0 0 |
如上图:我们向A和B的二进制数的各个对应位标记为相同的颜色,我们对两个二进制数的位运算操作就是在相同颜色(相同位)上进行的。0&0=0、0&1=0、1&1=1、得出A&B的结果00001100;
位逻辑运算代码演示:
public class Demo1 {
public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c );
}
}
输出结果:
a & b = 12a | b = 61a ^ b = 49~a = -61
具体咋操作的呢?首先将十进制数转换为二进制数,然后在让两个二进制数的对应位置去单独进行位运算,最后得出结果。
比较位逻辑运算符和逻辑运算符:
我们要明白,二者的操作对象是不同的,位运算符的操作对象是两个二进制数的对应位上的0或1
简单介绍下逻辑运算符:
逻辑运算符代码演示:
public class Test {
public static void main(String[] args) {
boolean a = true; boolean b = false;
System.out.println("a && b = " + (a&&b));
System.out.println("a || b = " + (a||b) );
System.out.println("!(a && b) = " + !(a && b));
}
}
输出结果:
a && b = falsea || b = true!(a && b) = true