2017-08-13 143 views
0

我通过破译编码和面试的位操作技术之一是如下工作:清楚,我到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

该报价假设[二补](https://en.wikipedia.org/wiki/Two%27s_complement)表示 – samgak

+0

请考虑如果您增加“全部”后会发生什么情况。 'x + 1 = 0'应该表示'x = -1'。 – harold

回答

2

假设您使用的是C/C++,int代表一个带符号的32位整数,用two's complement表示。

-1本身假定为int型,因此相当于0xFFFFFFFF。这衍生如下:

10x00000001。将这些位取反给出0xFFFFFFFE,并且加上1产生-1的二进制补码表示:0xFFFFFFFF,这是32个序列的序列。

+0

如果你不介意跟进:为什么1被添加到我?我正在通过一个简单的i = 1的情况来工作,并且1位移位似乎是您需要清除1位的全部内容,但是这个公式会让您移位两位。 – EternalStudent

+0

@EternalStudent如果i = 1,目标是清除比特1到0.我猜Gayle是从LSB(最低有效位)开始的零位索引。 '-1 << 2'将导致三十个然后两个零,并且当这两个零与AND时,他们清除'num'中的最低两位(1到0)。 – JoshuaRLi