一. 与、或、非、异或运算
与
0&&0 =0
1&&0 =0
0&&1 =0
1&&1 =1
或
0||0 =0
1||0 =1
0||1 =1
1||1 =1
非(求反)
~1 =0
~0 =1
异或
真^假=真
假^真=真
假^假=假
真^真=假
如:11001010 与
00011011 进行与或以及异或运算,结果分别是:
00001010 、11011011、11010001
二、位运算符
“>> 右移”;“<< 左移”;“>>> 无符号右移”
注意:右移相当于是除,左移相当于就是乘,左移一位乘以2,左移二位乘以4,依此类推。
无论正数、负数,它们的右移、左移、无符号右移32位都是其本身,比如 -5<<32=-5、-5>>32=-5、-5>>>32=-5
如:-5>>3=-1
-5<<3=-40
5>>3=0
5<<3=40
-5>>>3=536870911
int a=5;
System.out.println(a<<33);
按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩 下的都是零啊,所以输出结果应该是0才对啊, 可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<b转化为a<<(b%32) 来处理,所以当要移位的位数b超过32时,实际上移位的位数是b%32的值,那么上面的代码中a<<33相当于a<<1,所以输 出结果是10.