Java 位运算符详解
前情提要:
因为 位运算符 是按照二进制位操作
整数
的, 涉及到 二进制 和 整数存储方式(原码、反码、补码)
不懂的话可以参考 计算机底层如何存储不同的数据
一、简介
位运算符: 是按照
二进制位
进行运算的运算符, 左右两边都是整数。
- 位运算符的运算过程都是基于 补码运算,但是看结果,我们得换成原码,再换成十进制看结果
- 从二进制到十进制都是基于原码
- byte、short、char 在使用 位运算时 按照 int 类型处理
- 位运算直接对二进制进行位移操作实现数值运算,所以运算效率高
位运算符 | 符号解释 |
---|---|
& | 按位与,当两位相同时为 1 时 返回 1 |
\| | 按位或,只要有一位为 1 即可返回 1 |
^ | 按位异或,当两位相同时返回 0 ,不同时返回 1 |
~ | 按位非,将操作数的每个位(包括符号位)全部取反 |
<< | 左移运算符 |
>> | 右移运算符 |
>>> | 无符号右移运算符 |
二、如何区分 &,|,^ 是逻辑运算符还是位运算符?
如果操作数是boolean类型,就是逻辑运算符,如果操作数是整数,那么就位运算符。
三、例子
按位与 &
运算规则:对应位都是
1
才为1
正数运算
9 & 7 // 结果 1
负数运算
-9 & 7 // 结果 7
按位或 |
运算规则:对应位只要有
1
即为1
正数运算
9 | 7 // 等于 15
负数运算
-9 | 7 // 结果 -9
按位异或 ^
运算规则:当两位相同时返回
0
,不同时返回1
正数运算
9 ^ 7 // 结果 14
负数运算
-9 ^ 7 // 结果 -16
按位取反 ~
运算规则: 将操作数的每个位(包括符号位)全部取反
正数运算
~9 // 结果 -10
负数运算
~-9 // 结果 8
左移 <<
运算规则:实际操作的是位,可以理解为左移几位就相当于乘以
2
的几次方
3 << 4 // 类似于 3 * 2的4次 = 3*16 = 48
-3 << 4 // 类似于 -3 * 2的4次 = -3*16 = -48
右移 >>
运算规则:实际操作的是位,可以理解为除以
2
的n
次幂,如果不能整除,向下取整
69 >> 4 // 类似于 69 / 2的4次 = 69/16 = 4
-69 >> 4 // 类似于 -69 / 2的4次 = -69/16 = -5
无符号右移 >>>
运算规则:实际操作的是位,不看符号位
正数:和右移一样
负数:右边移出去几位,左边补几个0,结果变为正数
69 >>> 4 // 类似于 69 / 2的4次 = 69/16 = 4
-69 >>> 4 // 结果 268435451