x&(x-1)的巧用:用于判断x是否为2的n次幂,计算二进制1的个数

 

最近学到  x&(x-1) 这个式子的两个用法,跟大家分享一下。

作用:将x的二进制表示从最低位起第一个为1的位清0;

一、快速判定x是否为2^n幂。

如果x!=0  且x&(x-1)==0,则x为2的n次幂。(当然不能判定n是多少)

前提条件:x数据类型应为整数;

#define ispow2(x) ( (x)<= 0? 0 :( (x)&((x)-1) )==0  )

 

二、x=x&(x-1);

相关应用:计算x二进制表示中1的个数。

不用一位一位的移位了。

c代码:

int count=0;

while(x)

{

count++;

 x&=x-1;// x=x&(x-1);

}

 

在此 向第一个想到这些方法的人致敬!

这是一道位运算的综合题,全面考察了位运算的各种用法和技巧。在实现过程中,尽量只使用位运算的技巧来完成。 给你一个 int 范围内的整数 x x ,然后进行 q q 次操作,每次操作会以 op <a> <b> 的形式输入。操作类型如下几种可能(以下操作均为二进制下操作): ca a:修改,将 x x 的第 a a 位设置为 0 0 ,然后输出 x x ; cb a:修改,将 x x 的第 a a 位设置为 1 1 ,然后输出 x x ; cc a:修改,将 x x 的第 a a 位取反,然后输出 x x ; cd a b:修改,将 x x 的第 a ∼ b a∼b 位清零,然后输出 x x ; ce a b:修改,将 x x 的第 a ∼ b a∼b 位置 1 1 ,然后输出 x x ; cf:修改,将 x x 的所有位都取反,然后输出 x x ; ja a:判定 x x 和 a a 是否同号(同正同负),如果同号,输出 yes,否则输出 no。数据保证 x , a x,a 都不会为 0 0 ; jb a:判定 x x 的第 a a 位是不是 1 1 ,如果是,输出 yes,否则输出 no; jc a:判定 x x 和 a a 做按位与运算后的结果是不是 2 2 的整数次幂,如果是,输出 yes,否则输出 no; jd:判定 x x 中是否存在两个相邻位都为 1 1 的情况,如果存在,输出 yes,否则输出 no。若 x x 是负数,输出 err; ka a:计算,输出 2 ∣ x ∣ m o d a 2 ∣x∣moda 的结果并输出,保证 2 ≤ a ≤ 40 2≤a≤40 ; kb:计算,输出一行一个整数, x x 中 1 1个数,即输出 popcount(x); kc:计算,只保留 x x 的最后一位 1 1 ,其他位清零,即输出 lowbit(x); kd a:计算,只保留 x x 的第 a a 位,其他位清零后输出,保证 0 ≤ a < 32 0≤a<32 ; ke a b: 计算,只保留 x x 的第 a ∼ b a∼b 位构成的数字,其他位清零后输出; 说明: 这里的位运算都是在 int 范围(2 322 3112 322 311 )下进行的; 数据保证,若 a , b a,b 表示位数,则必满足 0 ≤ a ≤ b < 32 0≤a≤b<32 ,其他情况下,则默认 a a 在 int 范围内; 所有修改操作都会令 x x 的值发生变化,即影响后续的操作,所有的判定和计算操作不改变 x x ; 这里的第 a a 位指二进制下从右往左数的位数,最低位为第 0 0 位; 所有输出都单独占一行,即末尾都有换行。
05-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值