Java 位运算(移位、位与、或、异或、非)

Java提供的位运算符有:左移(<<)、右移(>>)、无符号右移(>>>)、位与(&)、位或(|)、位非(~)、位异或(^),除了位非(~)是一元操做符外,其它的都是二元操做符。一、左移(<<)Test一、将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进制为20二、右移(>>),右移同理,只是方向不同罢了(感受和没说同样)[java]System.out.println(5>>2);//运行结果是1仍是先将5转为2进制表示形式:00000000000000000000000000000101而后右移2位,高位补0:00000000000000000000000000000001三、无符号右移(>>>)咱们知道在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补。(自行测试)四、位与(&)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5&3);//结果为1}}仍是老套路,将2个操做数和结果都转换为二进制进行比较:5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------1转换为二进制:00000000000000000000000000000001位与:第一个操做数的的第n位于第二个操做数的第n位若是都是1,那么结果的第n为也为1,不然为0五、位或(|)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5|3);//结果为7}}5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------7转换为二进制:00000000000000000000000000000111位或操做:第一个操做数的的第n位于第二个操做数的第n位只要有一个是1,那么结果的第n为也为1,不然为0六、位异或(^)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5^3);//结果为6}}5转换为二进制:000000000000000000000000000001013转换为二进制:00000000000000000000000000000011-------------------------------------------------------------------------------------6转换为二进制:00000000000000000000000000000110位异或:第一个操做数的的第n位于第二个操做数的第n位相反,那么结果的第n为也为1,不然为0七、位非(~)位非是一元操做符[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
相关文章
相关标签/搜索