求二进制包含的1的个数(位操作)

本文介绍了一种使用Java编程语言通过位运算实现二进制数加法的方法,包括与操作、移位操作及循环计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Qiu {
   int count(byte a){
   int num =0;
   while(a!=0){

   //与操作
    num = num + (a&0x01); 

    System.out.println( num);

   //向右移位
    a=(byte) (a>>1);
  
  }
   
   
 return num;
   
   }
   public static void main(String[] args){
    Qiu qiu = new Qiu();
    System.out.println( qiu.count((byte) 9));
   }
}

### 统计二进制形式中1的数量 要统计个数字的二进制表示中1的数量,可以通过多种方法实现。以下是几种常见的解决方案及其解释。 #### 方法一:逐位检查法 通过不断右移数字并检查最低位是否为1来完成统计。这种方法的时间复杂度取决于输入数字的大小以及其二进制表示中的有效位数[^4]。 ```c int countOnes(int x) { int cnt = 0; while (x) { if (x & 1) cnt++; x >>= 1; // 右移一位 } return cnt; } ``` 此方法适用于任何整数(包括负数),但对于负数需注意补码的影响[^5]。 --- #### 方法二:Brian Kernighan 算法 利用 `n & (n - 1)` 这种操作可以快速去掉最右侧的1,从而减少循环次数。时间复杂度与二进制表示中1的实际数量成正比[^3]。 ```c int countOnes(int n) { unsigned int m = n; // 转换为无符号类型以兼容负数 int cnt = 0; while (m) { m &= (m - 1); cnt++; } return cnt; } ``` 这种算法效率较高,尤其当二进制表示中1较少时表现更优。 --- #### 方法三:查表法 预先构建一张表格记录每一位可能的情况,再分组查找即可得到结果。适合固定长度的数据类型(如8位、16位等)[^1]。 ```c // 假设已知字节范围内的所有情况 const char table[256] = { /* 预先填充好每种byte值对应的结果 */ }; int countOnes(unsigned int n) { return table[n & 0xFF] + table[(n >> 8) & 0xFF] + table[(n >> 16) & 0xFF] + table[(n >> 24) & 0xFF]; } ``` 这种方式速度最快,但需要额外的空间开销用于存储预计算好的数据。 --- #### Java 实现示例 在Java中也可以采用类似的逻辑实现该功能: ```java public class BitCounter { public static int bitCount(int i) { i = i - ((i >>> 1) & 0x55555555); // add pairs of bits i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); // quads i = (i + (i >>> 4)) & 0x0F0F0F0F; // groups of 8 return (i * 0x01010101) >>> 24; // sum all bytes } public static void main(String[] args) { System.out.println(bitCount(7)); // 输出: 3 System.out.println(bitCount(-1)); // 输出: 32 } } ``` 上述代码展示了如何高效地计算任意整数的汉明重量[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值