2017-08-13 69 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