15.二进制中1的个数

题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制1001,有2位1。因此如果输入9,该函数输出2。

基本思路:

解法一:首先把n和1做与运算,判断n的最低位是不是1。接着把1左移一位得到2,再和n做与运算,就能判断次低位是不是1...这样反复左移,每次都能判断n的其中一位是不是1。在这个解法中,循环的次数等于整数二进制表示的位数。

解法二:循环让(n - 1) & n。把一个整数减去一,再和原整数做与运算,会把原整数的最右边的1变成0。那么一个二进制整数表示中有多少个1,就要进行多少次这样的操作。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)。

解法一Java实现:

public class NumberOfOne {
	public static int numberOfOne(int n) {
		int count=0;
		int flag=1;
		//得到二进制表示
		String s=Integer.toBinaryString(n);
		for(int i=0;i<s.length();i++){
			if((n&flag)==1)
				count++;
			flag=flag<<1;
		}
		return count;
	}
	 

}

解法二Java实现:

public class NumberOfOne {

	
	 public static int numberOfOne2(int n) {  
	        // 记录数字中1的位数  
	        int result = 0;  

	        // 数字的二进制表示中有多少个1就进行多少次操作  
	        while (n != 0) {  
	            result++;  
	            // 从最右边的1开始,每一次操作都使n的最右的一个1变成了0,  
	            // 即使是符号位也会进行操作。  
	            n = (n - 1) & n;  
	        }  

	        // 返回求得的结果  
	        return result;  
	 }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值