我正在通过Cracking the Coding Interview工作,其中一个位操作技术如下:
要清除从i到0(包括)的所有位,我们取所有1的序列(-1)并将其向左移位i + 1位。这给了我们一个1的序列(在最高有效位中),然后是i 0位。
int clearBitsIthrough0(int num, int i){
int mask = (-1 << (i + 1));
return num & mask;
}
-1如何-1是所有1的序列?
答案 0 :(得分:2)
假设您使用的是C / C ++,h2
表示由two's complement表示的带符号的32位整数。
int
本身被假定为-1
类型,因此等同于int
。这推导如下:
0xFFFFFFFF
是1
。反转这些位会产生0x00000001
,并且添加一个会产生0xFFFFFFFE
:-1
的两个补码表示,一个32个序列。