【剑指offer】统计二进制整数中1的个数

方法 1

【知识点】:

1 整数-要判断整数的正负之分

2 位操作:左移(num<<n): 直接在右边补充n个0

                   右移(num>>n): 正数在左边补齐n个0,负数在左边补齐n个1

3二进制位数统计:依次从二进制尾端判断当前位置的0-1情况(利用与pos&1操作),当判断倒数第二位时候(&10),倒数第三位(&100)。。。,即每次1左移1位。

4 flag的移位为程序构建的循环终止条件(33次移位后,flag变为0),循环总共执行32次。

	private static int NumberOfOne(int num) {
		int count=0;
		int flag=1;
		while(flag!=0){
			if((num&flag)!=0)
			count++;
			flag=flag<<1;
		}	
		return count;
	}
方法 2

解题思路:

n&n-1的位操作相当于为n 消除了一个1

n-1的二进制是在n右边数第一位的1开始,此1之前的保持不变 ,此处的1变为0,此1以后的变的与原来相反。

private static int NumberOfOne2(int num) {
		int count=0;

		while(num!=0){
			count++;
			num=num&(num-1);

		}
				
		return count;
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值