JAVA的位运算<<、>>、>>>、&、|、^、~及实例

一、位运算左移:<<

指的是将对应的十进制先转换成二进制数,然后再根据需要移动几位来进行操作。比如

5<<2指的是将5这个十进制数的二进制位往左移动两位

5的二进制:00000000 00000000 00000000 00000101

左移两位:00000000 00000000 00000000 00010100

变成十进制数20。更简单的理解为:将要进行位运算的正数乘以2的N次方(N的值为要移位的位数),即5<<2就是5×2^2=20

在左移过程中,低位(最右边)用0来补,比如5的二进制左移2位后,右边空两位,整数的符号位是0,那么就用0来补。

例如:-5<<2指的是将-5这个十进制数的二进制位往左移动两位.

5的二进制:00000000 00000000 00000000 00000101

按位取反:111111111 111111111 11111111 11111010

+1得到-5的二进制即:111111111 111111111 11111111 1111 1011

左移两位:111111111 111111111 11111111 11101100

这是负数的补码,变为原来的二进制,按位取反+1

10000000 00000000 00000000 00010110

即为-20,最高位是符号位。更简单的理解为(有待考证,但感觉是对的,~~~~~):将要进行位运算的负数()乘以2的N次方(N的值为要移位的位数),即-5<<2就是-5×2^2=-20

二、位运算符右移:>>

与运算符左移类似,不过区别在于:

负数的移位上,比如-4>>2

4的原码:00000000 00000000 00000000 00000100

反码:111111111 111111111 11111111 11111011

+1:111111111 111111111 11111111 11111100

即-4的二进制码是:111111111 111111111 11111111 11111100

右移两位:111111111 111111111 11111111 11111111

取反加+1:10000000 00000000 00000000 00000001

得出-1,最高位是符号位,符号位不会变化的,1代表负数,0代表整数。

负数右移时,高位(最左边)用符号位来补,即右移的是负数,那么用1;右移的是正数,那么用0。

比如:4>>2

4的原码:00000000 00000000 00000000 00000100

右移两位: 00000000 00000000 00000000 00000001

变成1

三、位运算符无符号右移:>>>

无符号右移,忽略符号位,空位都以0补齐

比如6>>>2

二进制码:00000000 00000000 00000000 00000110

右移两位:00000000 00000000 00000000 00000001

高位(最左边)使用0来补齐的。

比如负数:-6>>>2

6的二进制码:00000000 00000000 00000000 00000110

按位取反+1得到-6的二进制码:111111111 111111111 11111111 11111010

右移两位:001111111 111111111 11111111 11111110

变回去按位取反+1:11000000 00000000 00000000 00000010

即得到1073741822

注:

  1.x<<y 相当于 x*2;x>>y相当于x/2y

  2.如果x是负数,那么x>>>2没有什么算术意义,只有逻辑意义

4的原码:00000000 00000000 00000000 00000100

四、与运算符:&-按位与

如果  4&7   那么这个应该怎么运算呢?

首先我们需要把两个十进制的数转换成二进制 

     4 : 0000 0100

     7 : 0000 0111

 

 

在这里要提到一点,1表示true,0表示false

而与运算的时候相同位之间其实就是两个Boolean的运算

                     全true(1),即为true(1)

                     全false(0),即为false(0)

                     一false(0)一true(1),还是false(0)

五、或运算符:|-按位或

以   5|9   为例

   5 : 0000 0101 

   9 : 0000 1001

 

 

在做或运算的时候

                 遇true(1)就是true(1),

                 无true(1)就是false(0)

六、异或运算符:^-按位异或

以 7^15 为例

           7:   0000 0111

           15: 0000 1111

 

 

在异或的时候

               只要相同都是false(0)

               只有不同才是true(1)

 

七、取反运算符:~-按位取反

例:   ~15

        同样的先变成二进制:15:0000 1111

 

 

这个其实挺简单的,就是把1变0,0变1

注意:二进制中,最高位是符号位   1表示负数,0表示正数

 

参考博客:https://www.cnblogs.com/SunArmy/p/9837348.html

posted @ 2018-12-08 12:21  花椒、斯国一  阅读(729)  评论(0编辑  收藏  举报