Hacker delight


将一个字的最右侧为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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值