如何删除最左边的位并在其最右边的位中添加位

本文关键字:添加 右边 左边 何删除 删除 | 更新日期: 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。