java位运算符,&,|,>>>,>>,<<,<<<的区别

说明

最近读到java ReentrantReadWriteLock 用到了位运算符 所以先看位运算符 再去学习源码

二进制在线计算器

http://www.99cankao.com/digital-computation/binary-decimal-converter.php

补码,反码,原码

https://www.cnblogs.com/shamo89/p/9846385.html

转为二进制进行运算 同为1时为1

如:3&5,3的二进制:11,5的二进制为101 运算后为001

计算

011

101

---

001

|

转为二进制进行运算,同为0时为0,否则为1

如:3&5,3的二进制:11,5的二进制为101 运算后为111

011

101

---

111

<<

注:因为java int是32位所以补了一堆0

表示左移移,不分正负数,低位补0;

正数:4<<1 

    转换为二进制00000000 00000000 00000000 00000100<<1   

           二进制向左移动1位低位补0得出00000000 00000000 00000000 00001000

           转为10进制=8

负数-4<<1

            负数的二进制表示为绝对值的二进制最高位补1,10000000 00000000 00000000 00000100

            反码(最高位符号位不变)11111111 11111111 11111111 111011

            补码(最低位进1)11111111 11111111 11111111 1111100

            补码左移(最低位补0) 11111111 11111111 11111111 111000

            反码(最高位符号位不变)11111111 11111111 11111111 110111

            原码(最高位符号位不变),10000000 00000000 00000000 00001000 最高位是符号位 所以我们直接拿1000转二进制等于8  最高位1 表示负数 所以得出-8

<<<

java没得这个编译出错

>>

表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

正数:r = 4 >> 1

        转换为二进制00000000 00000000 00000000 00000100

        右移1位 00000000 00000000 00000000 00000010

        转为10进制 2

负数 r = -4 >> 1

         转换为二进制10000000 00000000 00000000 00000100

         反码 11111111 11111111 11111111 11111011

         补码 11111111 11111111 11111111 11111100

         补码右移1位 11111111 11111111 11111111 11111110

         (根据补码反推反码)11111111 11111111 11111111 11111101

         (根据反码反推原码)原码10000 00000 10000 00000010

         10转二进制 2 符号位1表示负数 最终得出-2

>>>

表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

正数: r = 4 >>> 1

    的结果与 r = 4>> 1 相同;

负数: r = -4 >>> 1

  转换为二进制10000000 00000000 00000000 00000100

         反码 11111111 11111111 11111111 11111011

         补码 11111111 11111111 11111111 11111100

         补码右移1位(高位补0) 01111111 11111111 11111111 11111110

         补码转10进制等于2147483646

       

原文地址:https://www.cnblogs.com/LQBlog/p/15210471.html