-1

如何删除最左边的位?

我有一个十六进制值BF

它的二进制表示是1011 1111

如何删除第一位,即1,然后它将变为0111 1110

如何在最后一部分添加“0”?

4

3 回答 3

7

将变量的位 N 设置x0

x &= ~(1 << N);

工作原理:表达式 1 << N向左移动 N 次。对于 N = 7,这将是

1000 0000

按位 NOT 运算符~将其反转为

0111 1111

然后将结果与 进行按位与运算x得到:

xxxx xxxx
0111 1111
--------- [AND]
0xxx xxxx

结果:第 7 位(从 LSB 开始的从零开始的计数)被关闭,所有其他位都保留其先前的值。

将变量的位 N 设置x1

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 正如预期的那样。

看到它在行动

于 2012-05-13T13:00:51.933 回答
6
int i=0xbf;
int j=(i<<1) & 0xff;
于 2012-05-13T12:51:03.373 回答
1

或者你可以这样做: (i*2) && 0xff 如果你不想做一些玩弄。>>1 相当于 /2,<<1 相当于 *2。

于 2012-05-13T13:01:55.673 回答