java中的位运算

来源:互联网 发布:tensorflow官网镜像 编辑:程序博客网 时间:2024/06/07 04:47

适当的使用位运算可以提升java程序的效率。


什么是位运算?有哪些位运算符?

~ 取反  ,| 或  ,& 与 ,<< 有符号左移,>>有符号右移,>>>无符号右移,^ 异或


数据在计算机底层是用补码进行操作的。

整数的原码,补码和反码都是它本身。

负数的原码符号位是1;反码是除符号位,其他位取反;补码是反码+1.


例如:15 的 原码用八位来表示: 00001111  ,反码 00001111,补码 00001111

负数的位移运算:

  右移:左边的空出的位置1;左移:

   右移:

     -15的 原码 :10001111 , 反码 11110000 ,补码 11110001.


- 15 右移两位:11111100 求原码为: 10000100

      也可以用四位表示就是:11111,补码是10001,右移两位是11100,原码表示是10100,就是-4.


-20右移两位
10010100  补码 11101100 右移两位是 11111011求原码表示是 10000101. 就是-5.
左移:
-15左移2位:

补码:11110001->11000100  表示为原码是 10111100 结果是 60

-15左移4位:原码 1000 0000 0000 1111

补码:1111 1111 1111 0001->1111 1111 0001 0000 表示位原码是 1000 0000 1111 0000 结果是128+64+32+16 = 240

总结一下规律:

  右移:相当于 /2 ,因此绝对值会也来越小。

      负数:右移之后,高位都补1,而不是只有最高位补1;

      正数:右移之后,高位置0.

  左移:相当于 X2,因此数值会越来越大,应当注意溢出问题,像上面的-15左移4位,如果用8位来表示,则不能够表示正确的结果,因此应该注意左移的问题。

     正数 ,负数都是如此。

 

>>>(无符号右移)
运算规则:
把所有的二进制数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同,相当于把符号位一起移动。 其他结构和>>相似。


0 0
原创粉丝点击