我通過破譯編碼和麪試的位操作技術之一是如下工作:清楚,我到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