1.&和&&
按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;
逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true;只要有一个为零,a&&b就为零。(短路)
2.|和||
按位或:a|b是把a和b都转换成二进制数然后再进行或的运算
逻辑或:a||b是只要有一个为真结果就为真。(短路)
3.~ 非
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0,下面看一个简单例子。 public class data15 { public static void main(String[] args) { int a=2; System.out.println("a 非的结果是:"+(~a)); } }
4^ 异或异或运算符是用符号“^”表示的,其运算规律是: 两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个简单的例子。 public class data16 { public static void main(String[] args) { int a=15; int b=2; System.out.println("a 与 b 异或的结果是:"+(a^b)); } } 运行结果 a 与 b 异或的结果是:13 分析上面的程序段:a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即13。
5.移位
<< :左移运算符,num<<1,相当于num*2;
>>:右移运算符,num>>1,相当于num/2;空位以原来的符号位补齐
>>>:无符号右移,忽略符号位,空位以0补齐。
1.byte、short、char在做移位运算之前,会被自动转换为int类型,然后再进行运算。 2.byte、short、int、char类型的数据经过移位运算后结果都为int型。 3.long经过移位运算后结果为long型。 4.在左移位(<<)运算时,如果要移位的位数大于被操作数对应数据类型所能表示的最大位数,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。比如1<<35=1<<(352)=1<<3=8。 5.对于有符号右移位(>>)运算和无符号右移位(>>>)运算,当要移位的位数大于被操作数对应数据类型所能表示的最大位数时,那么先将要求移位数对该类型所能表示的最大位数求余后,再将被操作数移位所得余数对应的数值,效果不变。。比如100>>35=100>>(352)=100>>3=12。
因为如果移位的位数超过了该类型的最大位数,那么有效信息就全没了,这种移位是毫无用处的。
而对于无符号右移的一个应用场景:
对01111100 11100010 00101111 10101010,按照四位取值,此时需要用到右移和按位与,此时不适合使用>>,而应该使用>>>,因为如果是负数的话,>>就不会不断移入有效位,而使用>>>等全移入0时可知数据全部移动完毕(该应用场景有可能有疏漏),而且经常会使用的是无符号右移。
对变量进行位运算不会改变变量的值,除非是复合赋值表达式。