位运算在我们平时开发中很少会用到,以至于它被大多数人所忽略,因此在面试题中能频繁的看到位运算的身影。
(资料图片仅供参考)
由于位运算本质是二进制运算,大多数开发者可能会对此比较陌生,本文旨在揭开位运算的神秘面纱,一同探究其本质,帮助大家掌握位运算的方法。
位运算包括以下几类:
运算符 | 运算 | 规则 | 范例 |
<< | 左移 | 空位补0,被移除的高位丢弃,空缺位补0。 | 3 << 2 = 12 --> 3*2*2 = 12 |
>> | 右移 | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 | 3 >> 1 = 1 --> 3/2 = 1 |
>>> | 无符号右移 | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 | 3 >>> 1 = 1 --> 3/2 = 1 |
& | 与运算 | 二进制位进行&运算,只有1&1时结果是1,否则是0。 | 6 & 3=2 |
| | 或运算 | 二进制位进行|运算,只有0|0时结果是0,否则是1。 | 6 | 3 = 7 |
^ | 异或运算 | 相同二进制位进行^运算,结果是0; 1^1 = 0,0^0 = 0 不相同二进制位^运算结果是1。1^0 = 1,0^1 = 1 | 6^3 = 5 |
~ | 取反运算 | 正数取反,各二进制码按补码各位取反 负数取反,各二进制码按补码各位取反 | ~6 = -7 |
注意:运算符的运算过程都是基于二进制的补码运算,需预先了解二进制(原码、补码、反码)相关知识。
1.左移:<<
运算规则:在一定范围内,数据每向左移动一位,相当于原数据*2。(正数、负数都适用)
【注意】当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位,例:3 << 34 = 12,由于3的二进制总位数32,左移34相当于 3 << (34 - 32) --> 3 << 2 = 12。
3 << 4 --> 3*2的4次幂 => 3*16 => 48
二进制运算:
-3 << 4 --> -3*2的4次幂 => -3*16 => -48
二进制运算:
2.右移:>>
运算规则:在一定范围内,数据每向右移动一位,相当于原数据/2。(正数、负数都适用)
【注意】如果不能整除,向下取整。例:3.2 >> 1 = 1
69 >> 4 --> 69/2的4次 = 69/16 =4
二进制运算:
69 >> 4 --> -69/2的4次 = -69/16 = -5
二进制运算:
3.无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0。(正数、负数都适用)
69 >>> 4 --> 69/2的4次 = 69/16 =4
二进制运算:
-69 >>> 4 结果:268435451
二进制运算:
4.按位与:&
运算规则:对应位都是1才为1,否则为0。
1 & 1 = 1;1 & 0 = 0;0 & 1 = 0;0 & 0 = 0;9 & 7 = 1;-9 & 7 = 7;
二进制运算:
5.按位或:|
运算规则:对应位只要有1即为1,否则为0。
1 | 1 = 1;1 | 0 = 1;0 | 1 = 1;0 | 0 = 0;9 | 7 = 15;-9 | 7 = -9;
二进制运算:
6.按位异或:^
运算规则:对应位一个为1一个为0,才为1,否则为0。
1 ^ 1 = 0;1 ^ 0 = 1;0 ^ 1 = 1;0 ^ 0 = 0;9 ^ 7 = 14;-9 ^ 7 = -16;
二进制运算:
7.按位取反:~
运算规则:对应位为1,则结果为0;对应位为0,则结果为1。
~0 = 1;~1 = 0;~9 = -10;~-9 = 8;
二进制计算:
总结:位运算的核心是二进制运算,掌握以上7种运算方法,位运算将变得不再困难!
脚踏实地行,海阔天空飞~