计算整数中有多少bit 为1

int cnt(int x)
{
int n = 0;
while (x)
{
x = x & (x - 1);
n++;
}
return n;
}


为什么这样做可以呢,假如x的二进制表示为
x = X100...0, x-1 = X011...1,
x = x & (x - 1) = X000...0,把x的最低处的1变为0
n++

这个算法的计算量跟1的个数有关,如果1的个数较多,那还有更好log(n)的算法,请参考
[url]http://www.cppblog.com/zmllegtui/archive/2008/10/26/65071.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,变量a中有多少个1可以通过以下代码来求解: int count_ones(uint32_t a) { int ones = 0; while (a != 0) { ones += (a & 1); a = a >> 1; } return ones; } 其中,uint32_t是无符号32位整型,通过按位与运算符&和右移运算符>>找出二进制表示中的每一个1,然后将其逐个加起来。 ### 回答2: 对于一个32位的变量a,我们可以使用位运算来统计其中1的个数。一个简单的方法是使用一个循环,对a进行32次迭代,每次检查a的最低位是否为1,如果是则计数加一,然后将a右移一位。代码示例如下: ``` int count = 0; // 初始化计数器为0 for (int i=0; i<32; i++) { if ((a & 1) == 1) { count++; } a = a >> 1; } ``` 另一种更高效的方法是使用Brian Kernighan算法,该算法利用了一个性质:将一个数减去1,会将其最右边的1及其右边的0都变成1。因此,我们可以不断将a与a-1相与操作,直到a为0,每次操作都会将a的最右边的1变为0,计数增加1。代码示例如下: ``` int count = 0; while (a != 0) { a = a & (a-1); count++; } ``` 这两种方法都可以统计32位变量a中1的个数,第一种方法逐位检查,时间复杂度为O(32),第二种方法根据二进制中1的个数直接计算,时间复杂度为O(1)。但是在实际应用中,由于编译器对位运算进行了优化,两种方法的效率差别并不大。 ### 回答3: 对于一个32位的变量a,我们可以通过遍历每一位来计算出其中有多少个1。 我们可以用一个循环来遍历32位中的每一位,从最低位到最高位。首先初始化一个变量count为0,表示1的个数。 在每一次循环中,我们可以使用位掩码操作(bit masking)来检查当前位是否为1。我们可以通过将1左移i位,得到一个只有第i位为1的数字mask。然后,我们可以使用按位与操作符&将a和mask进行位运算,如果结果不为0,则表示第i位是1。在这种情况下,我们将count加1。 最后,循环结束后,变量count的值就是a中1的个数。 以下是一个示例代码: ```python count = 0 for i in range(32): mask = 1 << i if a & mask != 0: count += 1 print("变量a中有", count, "个1.") ``` 注意,该示例代码中的变量a需要提前定义并赋值。该方法可以用于任何32位的整数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值