如何删除最左边的位?
我有一个十六进制值BF
它的二进制表示是1011 1111
如何删除第一位,即1
,然后它将变为0111 1110
?
如何在最后一部分添加“0”?
x
为0
x &= ~(1 << N);
工作原理:表达式 1 << N向左移动 N 次。对于 N = 7,这将是
1000 0000
0111 1111
然后将结果与 进行按位与运算,x
得到:
xxxx xxxx
0111 1111
--------- [AND]
0xxx xxxx
结果:第 7 位(从 LSB 开始的从零开始的计数)被关闭,所有其他位都保留其先前的值。
x
为1
x |= 1 << N;
它是如何工作的:这次我们将移位的位和按位或它与x
,给出:
xxxx xxxx
1000 0000
--------- [OR]
1xxx xxxx
结果:第 7 位打开,所有其他都保留其先前的值。
1
:如果您不知道设置为 1 的最高位是哪个,您可以即时找出。有很多方法可以做到这一点;一个合理的方法是
int x = 0xbf;
int highestSetBit = -1; // assume that to begin with, x is all zeroes
while (x != 0) {
++highestSetBit;
x >>= 1;
}
在循环结束时,highestSetBit
将是 7 正如预期的那样。
int i=0xbf;
int j=(i<<1) & 0xff;
或者你可以这样做: (i*2) && 0xff 如果你不想做一些玩弄。>>1 相当于 /2,<<1 相当于 *2。