如何删除最左边的位并在其最右边的位中添加位
本文关键字:添加 右边 左边 何删除 删除 | 更新日期: 2023-09-27 18:34:11
如何删除最左边的位?
我有一个十六进制值BF
它的二进制表示形式是1011 1111
如何删除第一个位,即1
,然后它就会变得0111 1110
?
如何将"0"也添加到其最后一部分?
将变量x
的位 N 设置为 0
x &= ~(1 << N);
工作原理:表达式 1 <<N 向左移动 N 次。对于 N = 7,这将是
1000 0000
按位 NOT 运算符~
将其反转为
0111 1111
然后结果是按位 AND 与 x
,得到:
xxxx xxxx
0111 1111
--------- [AND]
0xxx xxxx
结果:位 7(从 LSB 开始的从零开始的计数(关闭,所有其他位保留其先前的值。
将变量x
的位 N 设置为 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。