说明
最近读到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