求一个正整数二进制中1的个数

思路:一个数与1作与运算则可以发现该数最后一位数为1,否则为0.然后做移位操作。

 import java.util.*;

public class Main {

 
	public int solution(int input) {
		int count=0;//1的个数
		while(input!=0){
			if ((input & 1) == 1)
      {
          count++;
      }
			input >>= 1;
		}
		return count;
	}
} 
### C语言实现计算整数二进制表示1个数 #### 取余法 通过不断对2取余并累加余数可以统计出二进制表示中有多少个1。每次模操作后,将原数值右移位继续上述过程直到该数值变为零。 ```c int countBitsRemainder(int num){ int cnt = 0; while (num != 0) { cnt += num % 2; // 如果当前最低位是1,则计数器增加 num /= 2; // 将数字向右移动位相当于去掉最后位 } return cnt; } ``` 此方法简单直观但是效率较低因为涉及到大量的除法运算[^1]。 #### 移位法 利用按位与(&)以及无符号右移(>>)的操作来逐位检测每位是否为1,并且每轮循环都将目标值减半直至其归零为止。 ```c unsigned int countSetBitsShift(unsigned int n){ unsigned int count = 0; while (n) { count += n & 1u; // 判断最右边的位是不是1 n >>= 1; // 把这个数往右移去下次判断下一个低位 } return count; } ``` 这种方法相较于前种性能更优因为它只用了基本逻辑指令而没有复杂的算术运算。 #### 高级计算法——Brian Kernighan’s Algorithm 对于非负整数x来说,`x&(x−1)`会使得x中最右侧的那个'1'变'0',因此可以通过重复执行这操作直到整个数变为全0从而得知其中含有几个1. ```c int bitCountBKAlg(unsigned long x){ int bits = 0; while(x!=0){ ++bits; x &= (x - 1); } return bits; } ``` 这种技巧不仅简洁而且高效特别适合处理大范围内的正整数.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值