目标
- 常用位运算符的作用
- 获取某个二进制位
- 获取某些二进制位
按位与 & 用于屏蔽某些二进制位,即置为 0。
10110101011
& 11111000000
= 10110000000
注意,屏蔽字的位数必须与 x 一致,否则前面会补 0。例:设屏蔽字为 1111000000。
10110101011
& 01111000000
= 00110000000
有时候 x 的位数未知,不知道前面要补多少个 1,可以考虑用 ~ 取反。
比如使用屏蔽字 ~0b111111 将后 6 位置为 0。
10110101011
& (~00000111111)
= 10110101011
& 11111000000
= 10110000000
按位或 | 将某些二进制位置为 1。
10110101011
| 11111100000
= 11111101011
按位异或 ^ 将某些二进制位取反。
10110101011
^ 11111100000
= 01001001011
获取 x 中的某个二进制位
方法1
获取 x 的第 n 位二进制,定义最右边的一位是第 0 位,右移 n 位。
例:获取 1011110 的第 3 位,右移 3 位 => 0001011,然后按位与 1,那么只剩下第 n 位。
int getBit(int i, int n) {
return (i >> n) & 1;
}
方法2
屏蔽字的除了指定位为 1(可以让 1 左移 n 位),屏蔽字的其余位都为 0,也只剩下第 n 位。
例:获取 1011110 的第 3 位,1 右移 3 位 => 1000,然后按位与。
1011110
& 0001000
= 0001000
可以看出如果第 n 位为 0,则结果为 0;如果第 n 位为 1,则结果为 2n。
int getBit(int i, int n) {
return i & (1 << n) == 0 ? 0 : 1;
}
获取 x 中的某些二进制位
例:获取 1011110 的第 3 ~ 5 位:011。
先右移 3 位 => 0001011,应让 011 之前的位全部置为 0,也就是原来的第 6 位到第 length-1 位置为 0,现在右移三位,于是第 6 位变成了第 3 位了。
屏蔽字为 111,即 25+1-3 - 1。但不想求幂,换一个方法。
反推导得到 111 的过程。
000...000111
取反 111...111000
右移 111...111111
-1: 111...111111
左移:1111...1000
取反:0000...0111
int getBits(int i, int start, int end) {
return (i >> start) & ~(-1 << (end-start+1));
}
其中 -1 可以替换为 ~0。
我昨天似乎说了,把想要离职的意图透露给同事,我虽说不在乎,但不建议新手学我,否则第 2 天,消息就传遍整个公司,那时你就很尴尬,不走也得走。
我并不是脸皮厚,像我们这类人,不会向别人求助,能不交流就不交流,尽量避免打招呼。比如路上没有带纸、水,并不会指望能够向陌生人借到,诶,万一他也没有呢?这些事早就在出门前就应该想好,2 包纸、2 瓶水、伞,手机和现金若干,以免用完纸,店家又不接受手机支付的情况。
所以最坏情况都预料到了,无所谓别人怎么说。别人对我好,我可能很难察觉,但感知坏情绪还是挺容易的。
我接下来想做什么职业?按我目前认知来看,我都不想选择。也许我对某职业有误解,或者有未知的职业等我发掘。就这样吧。
书中例子是 p+1-n,这个很容易推导。
[start, end],数量 n = end-start+1,p = end。
则 start = p+1-n,正好 x 右移 start 位。