class="MsoNormal">Java位运算符列表如下:
&
与
同为1则为1,其余为0
|
或
一个为1则为1,否则为0
^
异或
相同为0,不同为1
~
非
为1则为0,为0则为1
<<?
左位移
将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)
>>?
右位移
将运算符左边的运算对象向右移动运算符右侧指定的位数。 “有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
>>>?
无符号右移
无论正负,都在高位插入0
?
在了解位运算之前,先要了解一下二进制的一些表示方法,这里使用的是java语言(注意:在java中是不允许二进制表示的,允许八进制和十六进制),先来看一下十进制转二进制:
?
System.out.println(Integer.toBinaryString(10)); //打印结果:1010
System.out.println(Integer.toBinaryString(-10));//打印结果:11111111111111111111111111110110
?
1.???????? 对于正数的转换比较简单,比如上面的10,转换二进制后是1010。
2.???????? 但对于负数的转换稍麻烦,先取负数的绝对值,-10的绝对值是10,二进制是1010,补足32位:00000000000000000000000000001010,然后取反:11111111111111111111111111110101,再+1,最终结果是:11111111111111111111111111110110,以上就是负数的二进制转换过程。
(一)?? 接下来再看具体的位运算:
举例一:
System.out.println(5&6); //打印结果:4
运算过程:5转换二进制0101,6转换二进制0110,按照同为1为1的规则,结果是0100,转换成十进制是4。
举例二:
System.out.println(-5&6); //打印结果:2
运算过程:-5转换成二进制11111111111111111111111111111011,6转换二进制00000000000000000000000000000110,按照同为1为1的规则,结果是00000000000000000000000000000010,转换成二进制是2。
举例一:
System.out.println(-5|-6); //打印结果:-5
运算过程:-5 转换二进制11111111111111111111111111111011,-6转换二进制11111111111111111111111111111010,按照一个为1则为1的原则,结果是11111111111111111111111111111011,转换成十进制是-5。
举例一:
System.out.println(~-5); //打印结果:4
运算过程:-5转换二进制11111111111111111111111111111011,按照1为0,0为1的原则,结果是00000000000000000000000000000100,转换十进制是4。
举例一:
System.out.println(2^3); //打印结果:1
运算过程:2转换二进制0010,3转换二进制0011,按照相同为0,不同为1的原则,结果是0001,转换十进制是1。