位运算符
位运算符的本质是通过转换为二进制后进行位的操作的计算方式
位运算符有 7 个,分为两类:
- 逻辑位运算符:位与(&)、位或(|)、位异或(^)、非位(~)
- 移位运算符:左移(<<)、右移(>>)、无符号右移(>>>)
移位运算符:
左移、右移,不与正负号有关
无符号运算符,与正负号有关
1、左移 <<
总结:左移的结果表现为:x << y === x * 2^y
例:5 << 1
第一步:转码,将 5 转换为二进制数 101
第二步:补码,补齐32位二进制数 0000 0000 0000 0000 0000 0000 0000 0101
第三步:左移,左移 1 位,末位数补0 0000 0000 0000 0000 0000 0000 0000 1010
第四步:转为十进制数,取得结果, 10
例:-5 << 1
取得结果为 -10
2、右移 >>
总结:右移到结果表现为:x >> y === (x / (2^y))的整数部分
偶数运算
例:6 >> 1
第一步:转码,将 6 转换为二进制数 110
第二步:补码,补齐32位二进制数 0000 0000 0000 0000 0000 0000 0000 0110
第三步:左移,左移 1 位,末位数补0 0000 0000 0000 0000 0000 0000 0000 0011
第四步:转为十进制数,取得结果, 3
例:-6 >> 1
取得结果为 -3
奇数运算
例:5 >> 1
第一步:转码,将 5 转换为二进制数 101
第二步:补码,补齐32位二进制数 0000 0000 0000 0000 0000 0000 0000 0101
第三步:左移,左移 1 位,末位数补0 0000 0000 0000 0000 0000 0000 0000 0010
第四步:转为十进制数,取得结果, 2
3、无符号右移 >>>
名字虽然为无符号右移,实际上是带符号右移
正数运算
与 右移运算 >> 相同
负数运算
例:-5 >>> 3
第一步:转码,将 5 转换为二进制数 101
第二步:补码,补齐32位二进制数,正数首位为0,负数首位为 1 1000 0000 0000 0000 0000 0000 0000 0101
第三步:反码,将二进制数反转,符号位不变,即 0 -> 1,1 -> 0 1111 1111 1111 1111 1111 1111 1111 1010
第四步:右移 3 位 0001 1111 1111 1111 1111 1111 1111 1111
第五步:取得十进制数,536870911
逻辑位运算符:位与(&)、位或(|)、位异或(^)、取非(~)
在位运算中,二进制数 1 表示 true,0 表示 false
位与(&):对两个数的二进制数,逐位比较,若该位都为真,则该位为真,若有假,则为假
例 :6 & 5
6 --> 1 1 0
5 --> 1 0 1
结果: 1 0 0 --> 4
位或( | ):逐位比较,若该位有真,则该位为真,若都为假,则为假
例 :6 & 5
6 --> 1 1 0
5 --> 1 0 1
结果: 1 1 1 --> 7
位异或(^): 逐位比较,若该位 同为真 或 同为假,则为假,反之为真
例 :6 & 5
6 --> 1 1 0
5 --> 1 0 1
结果: 0 1 1 --> 3
~:取非
将正数的原码转换为补码(都是它的二进制啦)
对补码按位取反 (注意二进制第一个符号位,原本是0,代表正数)
正数的补码按位取反后,将补码转换为原码(转换规则也是非符号位的按位取反加1)
将原码转换对应进制输出(10进制)
例:~6
负数的原码转补码,补码转原码都是按位取反再 +1
第一步:6的源码为 0000 0110,正数的源码与补码一致,补码:0000 0110
第二步:对补码按位取反:1111 1001
第三步:转换为原码输出:1000 0111 --> -7
例:~(-6)
原:1000 0110
补:1111 1010
取反:0000 0101
转原码:0000 0101 --> 5