在看位处理代码时经常就会看到:(变量)与(自己的补码)做位或,也就是x|-x
这个处理的结果就是:得到一个值y,y从最低位开始有多少个连续的0,那x也一样。
例如:
1)
1010 1011 1100 1101 --> x
0101 0100 0011 0011 --> -x
1111 1111 1111 1111 --> x|-x
2)
1010 1011 1100 1000 --> x
0101 0100 0011 1000 --> -x
1111 1111 1111 1000 --> x|-x
3)
1010 1000 0000 0000 --> x
0101 1000 0000 0000 --> -x
1111 1000 0000 0000 --> x|-x
产生这样的效果归功于补码的定义——全部位取反后加1,而这个1就把从最低位开始第一段连续的1全部变成0(因为进位),结果这段0就跟原码中的0一样了,在位或的时候还是为0。