将一个字的最右侧为1的位改成0
x&(x-1)
检测一个无符号整数是否为2的幂
x&(x+1)
解析出一个字的最右侧的1位(1010100 >> 0000100)
x&(-x)
解析出一个字的最右侧的0位(1010111 >> 0001000 )
-x&(x-1)
x|(x-1)
使一个字的最右侧连续的1位改为0
( (x|(x-1)) + 1)& x
将一个字的最右侧的0位改成1位
x|(x+1)
计算一个字有多少位为1
int pop(unsigned x)
{
int n=0;
while(x){x&=(x-1); ++n;}
return n;
}
字的前导位为0的计数
if(x == 0)return 32;
int n=0;
if(x <= 0x0000FFFF){n+=16; x <<16;}
if(x <= 0x00FFFFFF){n+=8; x <<8;}
if(x <= 0x0FFFFFFF){n+=4; x <<4;}
if(x <= 0x3FFFFFFF){n+=2; x <<2;}
if(x <= 0x7FFFFFFF){n+=1;}
return n;
寻找第一个连续n个1位的串,“移位和与”
int s=0;
while(n>>1)
{s = n>>1;
x = x & (x<<s);
n = n -s;
}
return nlz(x);