位运算符
21(十进制整数)
21 << 2 = ?
首先将21转换位二进制
10101 向左移两位,空出位置补0 于是变成了
1010100 转为十进制:1 * 2 2 + 1 * 2 4 + 1 * 2 6 = 84
所以 21 << 2 = 84
总结: 每向左移一位相当于在原来数上的基础乘以2,即 21 * 2 n ,n为向左移位数
举例说明:
10101 = 1 * 2 0 + 1 * 2 2 + 1 * 2 4
21(十进制整数)
21 >> 2 = ?
首先将21转换位二进制
10101向右移两位,前方位置补零于是变成了
00101 转为十进制:1 * 2 0 + 1 * 2 2 = 5
所以 21 >> 2 = 5
总结:每向右移一位相当于在原来数上的基础除以2,即 21 / 2 n ,n为向右移位数
推导过程:
10101 = 1 * 2 0 + 1 * 2 2 + 1 * 2 4
位运算符的效率高于算术运算符。
经典面试题:
最高效的方式计算 2 * 8 ?
答: 2 << 3 或 8 << 1
12 & 5 = 4
过程
12 => 1100(二进制)
5 => 0101(二进制)
比较过程:
0 & 1 = 0; 0 & 0 = 0 ; 1 & 1 = 1; 1 & 0 = 0
结果为 0100(二进制) => 4 (十进制)
总结:只有当比较双方都为1时,结果才为1,,否则为0
12 | 5 = 4
过程
12 => 1100(二进制)
5 => 0101(二进制)
比较过程:
0 | 1 = 1; 0 & 0 = 0 ; 1 & 1 = 1; 1 & 0 = 1
结果为: 1101(二进制) => 13(十进制)
总结:当比较双方只要有一个为1,那么其值为1,否则为0
12 ^ 5 = 4
过程
12 => 1100(二进制)
5 => 0101(二进制)
比较过程:
0 ^ 1 = 1; 0 ^ 0 = 0 ; 1 ^ 1 = 0; 1 ^ 0 = 1
结果为:1001(二进制) => 9 (十进制)
总结:当比较双方都为异(值不同)时,才等于1,否则为0
~6 = -1
过程
6 => 0110(二进制)
包括符号位在内的所有数取反
即变为1001 => -7
注意:要将二进制码转换为补码才能进行取反,取反包括符号位
图片部分来自网络引用,如有侵犯请联系作者删除