Java提供的位运算符有:左移(<<)、右移(>>)、无符号右移(>>>)、位与(&)、位或(|)、位非(~)、位异或(^),除了位非(~)是一元操作符外,其它的都是二元操作符。1、左移(<<)Test1、将5左移2位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5<<2);//运行结果是20}}运行结果是20,但是程序是怎样执行的呢?首先会将5转为2进制表示形式(java中,整数默认就是int类型,也就是32位):00000000000000000000000000000101然后左移2位后,低位补0:00000000000000000000000000010100换算成10进制为202、右移(>>),右移同理,只是方向不一样罢了(感觉和没说一样)[java]System.out.println(5>>2);//运行结果是1还是先将5转为2进制表示形式:00000000000000000000000000000101然后右移2位,高位补0:000000000000000000000000000000013、无符号右移(>>>)我们知道在Java中int类型占32位,可以表示一个正数,也可以表示一个负数。正数换算成二进制后的最高位为0,负数的二进制最高为为1例如-5换算成二进制后为:11111111111111111111111111111011(刚开始接触二进制时,不知道最高位是用来表示正负之分的,当时就总想不通。。明明算起来得到的就是一个正数-_-)我们分别对5进行右移3位、-5进行右移3位和无符号右移3位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5>>3);//结果是0System.out.println(-5>>3);//结果是-1System.out.println(-5>>>3);//结果是536870911}}我们来看看它的移位过程(可以通过其结果换算成二进制进行对比):5换算成二进制:000000000000000000000000000001015右移3位后结果为0,0的二进制为:00000000000000000000000000000000//(用0进行补位)-5换算成二进制:11111111111111111111111111111011-5右移3位后结果为-1,-1的二进制为:11111111111111111111111111111111//(用1进行补位)-5无符号右移3位后的结果536870911换算成二进制:00011111111111111111111111111111//(用0进行补位)通过其结果转换成二进制后,我们可以发现,正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)注意:笔者在这里说的是右移,高位补位的情况。正数或者负数左移,低位都是用0补。(自行测试)4、位与(&)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5&3);//结果为1}}还是老套路,将2个操作数和结果都转换为二进制进行比较:5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------1转换为二进制:00000000000000000000000000000001位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为05、位或(|)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5|3);//结果为7}}5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------7转换为二进制:00000000000000000000000000000111位或操作:第一个操作数的的第n位于第二个操作数的第n位只要有一个是1,那么结果的第n为也为1,否则为06、位异或(^)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5^3);//结果为6}}5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------6转换为二进制:00000000000000000000000000000110位异或:第一个操作数的的第n位于第二个操作数的第n位相反,那么结果的第n为也为1,否则为07、位非(~)位非是一元操作符[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(~5);//结果为-6}}5转换为二进制:00000000000000000000000000000101--------------------------------------------------------------------------------------6转换为二进制:11111111111111111111111111111010位非:操作数的第n位为1,那么结果的第n位为0,反之。由位运算操作符衍生而来的有:&=按位与赋值|=按位或赋值^=按位非赋值>>=右移赋值>>>=无符号右移赋值<<=赋值左移和+=一个概念而已。举个例子:[java]www.2cto.compackagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){inta=5a&=3;System.out.println(a);//结果是1}}作者:xiaochunyong