Hacker delight

来源:互联网 发布:mysql front下载 编辑:程序博客网 时间:2024/05/29 08:02


将一个字的最右侧为1的位改成0

x&(x-1)


检测一个无符号整数是否为2的幂

x&(x+1)


解析出一个字的最右侧的1位(1010100 >> 0000100)

x&(-x)


解析出一个字的最右侧的0位(1010111 >> 0001000 )

-x&(x-1)


使一个字向右传播最右侧的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);

0 0