我通过破译编码和面试的位操作技术之一是如下工作:清楚,我到0位
从我到0(含)清除所有位,我们采取一个序列全部为1(即-1),并将其左移i + 1位。这给了我们1个序列(最高有效位),然后是0个位。
int clearBitsIthrough0(int num, int i){
int mask = (-1 << (i + 1));
return num & mask;
}
如何为-1全部为1的序列?
我通过破译编码和面试的位操作技术之一是如下工作:清楚,我到0位
从我到0(含)清除所有位,我们采取一个序列全部为1(即-1),并将其左移i + 1位。这给了我们1个序列(最高有效位),然后是0个位。
int clearBitsIthrough0(int num, int i){
int mask = (-1 << (i + 1));
return num & mask;
}
如何为-1全部为1的序列?
假设您使用的是C/C++,int
代表一个带符号的32位整数,用two's complement表示。
-1
本身假定为int
型,因此相当于0xFFFFFFFF
。这衍生如下:
1
是0x00000001
。将这些位取反给出0xFFFFFFFE
,并且加上1产生-1
的二进制补码表示:0xFFFFFFFF
,这是32个序列的序列。
如果你不介意跟进:为什么1被添加到我?我正在通过一个简单的i = 1的情况来工作,并且1位移位似乎是您需要清除1位的全部内容,但是这个公式会让您移位两位。 – EternalStudent
@EternalStudent如果i = 1,目标是清除比特1到0.我猜Gayle是从LSB(最低有效位)开始的零位索引。 '-1 << 2'将导致三十个然后两个零,并且当这两个零与AND时,他们清除'num'中的最低两位(1到0)。 – JoshuaRLi
该报价假设[二补](https://en.wikipedia.org/wiki/Two%27s_complement)表示 – samgak
请考虑如果您增加“全部”后会发生什么情况。 'x + 1 = 0'应该表示'x = -1'。 – harold