JAVA基础之位运算符

185 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

位运算(位指的是二进制位或者是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次幂

无符号右移和右移区别:右移操作后,左边会空出位置来,空位置用改操作数的符号位置的数补全;无符号右移,左边空出来的位置全部用补全。