在阅读 EnumSet 源码时发现涉及到了位运算的操作,复习一下
左移
<<
为算数左移,将以二进制表示的数字中的0和1向左平移相应的位数,移位产生的空缺用零来补充;正负数没有区别
1 | System.out.println(Integer.toBinaryString(-1)); |
右移
>>
为算数右移(arithmetic shift right),将以二进制表示的数字中的0和1向右平移相应的位数,对于由于位移产生的空缺,负数用1补,正数用0补>>>
为逻辑右移(logical shift right),和算数右移同理,但是空缺的位数都是用0补
1 | System.out.println(Integer.toBinaryString(-13)); |
非
~
把0变成1,把1变成0
1 | // 为了方便找规律我把高位补0了 |
与
&
两个二进制数进行与运算,对应位上只要有0则结果对应位为0,否则为1
1 | System.out.println(Integer.toBinaryString(121)); |
或
|
两个二进制数进行与运算,对应位上只要有1则结果对应位为1,否则为0
1 | System.out.println(Integer.toBinaryString(121)); |
异或
^
两个二进制数进行与运算,对应位上数字不相同则结果对应位为1,否则为0
1 | System.out.println(Integer.toBinaryString(121)); |