位运算(位指的是二进制位或者是bit位)
计算机中所有的计算到计算机底层中都会变成位运算(就是二进制位的运算)。位运算可以提高程序的效率!学习JDK源码的过程中发现很多地方都用到位运算,比如HashMap在中计算key应该放在那个hash桶位置时就用到了位运算。
有符号数
有符号数由两部分组成:
1.符号位(二进制的最左边的一位表示符号位,0表示正数,1表示负数)
2.数值位
3.计算机中存储有符号数据的时候时按照补码形式存进去的。
正数的原码、反码、补码都一样
原码
就是符号位+数值位(数据的绝对值)
反码
就是符号位不变,其它位全部1变0,0变1
补码
在反码的基础上+1生成补码
例如:+7
原码:0b000000000000000000000000000000111
反码:0b000000000000000000000000000000111
补码:0b000000000000000000000000000000111
例如:-7
原码:0b100000000000000000000000000000111
反码:0b111111111111111111111111111111000(除符号位不变,其它1变0,0变1)
补码:0b111111111111111111111111111111001 反码+1生成补码
如何把补码转换成原码
补码-1得到反码,反码再取反得到就是原码(符号位不变)
位运算符号种类
&:按位与
| :按位或
^:按位异或
~ :按位取反
<<: 左移
>>: 右移
>>>:无符号右移
注意:进行位运算的时候所有的操作数全部都是二进制,并且时补码
按位与
规则:两个同为1的时候才为1,属于双目运算符
例如
3的二进制 :00000000000000000000000000000011
4的二进制 :00000000000000000000000000000100
3和4按位与 :00000000000000000000000000000000
按位与后的结果位0
按位或
规则:两个中只要有一个为1,就为1,属于双目运算符
3的二进制 :00000000000000000000000000000011
4的二进制 :00000000000000000000000000000100
3和4按位与 :00000000000000000000000000000111
按位或后的结果位7
按位异或
规则:两个不一样的时候才为1,如果一样就为0,属于双目运算符
按位取反
例如3的二进制:0b00000000000000000000000000000011
取反后的结果: 0b11111111111111111111111111111100 这个是补码
补码-1后获取反码:
补码: 0b1111111111111111111111111111100
- 1
------------------------------------------------
0b1111111111111111111111111111011
反码取反获取原码
0b1000000000000000000000000000100
左移
让操作数乘以2的n次幂,n是移动的位数
格式:
操作数<<往左移动的位数
右移
让操作数除以2的n次幂,n是移动的位数
格式:
操作数>>往右移动的位数
无符号右移
无符号右移也是操作数除以2的n次幂
无符号右移和右移区别:右移操作后,左边会空出位置来,空位置用改操作数的符号位置的数补全;无符号右移,左边空出来的位置全部用补全。