二进制中的技巧

 

1. 除以2运算相当于>>1运算

 

2.交换二进制数中相连的1和0的方法:

如a=XXX10XX,要交换第四位的1和第三位的0,则令a=a-100;

如a=XXX01XX,要交换第四位的0和第三位的1,则令a=a+100;

 

3.二进制数a减1,相当于将a末尾的0置为1,将最低位的1置为0:

如a=XXX1000,a-1=XXX0111

利用这个特性,可以用如下方法求出a有多少个1,复杂度为O(V),V为a包含1的个数:

int num=0;
while(a)
{
 a=a&(a-1);
 num++;
}
return num;

 

4.十进制数N的二进制数末尾有多少个0,取决于这个N有多少个质因子2:

如20=4×5=2×2×5,所以20的二进制数10100末尾有2个0

这是因为10100做两次<<1运算后,遇到最低位1,每做一次<<1运算相当于除以2。

所以要求N的最低位1位于第几位时,可以令n=N-[N&(N-1)],看n有多少个0,即:

int n=N-[N&(N-1)],
int num=0;
while(n)
{
 n<<1;
 num++;
}

 

5.如果要求一个数A模B的结果,而B=2^n,则求解可以用A&(B-1)代替

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值