剑指offer面试题10:二进制中1的个数(与位运算有关)

题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。


分析:

1、可以用一个二进制表示时仅有1位为1的整数(将该整数记为flag)与输入的整数按位与,来判断如果相与的结果不为0,说明输入整数的对应位为1。如flag=8,32位整数,二进制表示为00000000 00000000 00000000 00001000,即第4位为1,如果输入数据为9,则与flag按位与的结果不为0,说明9的第4位为1。

2、通过1的分析,可以设置flag初始为1,与输入值进行按位与操作,判断输入数据的第1位是否为1,然后将flag向左移1位,再与输入数据按位与,这样循环32次可以统计出输入数据对应二进制中1的个数。


我的代码

public class Solution {
    public int NumberOf1(int n) {
        int flag = 1;
        int count = 0;
        while(flag != 0){
            if((n&flag)!=0){
                count +=1;
            }
            flag = flag<<1;//左移以为,如果超出计算机可以表示的最大位数,则左移后的结果为0,整数的位数为32位,所以左移32次之后flag值为0
        }
        return count;
    }
}



剑指offer中给出更好的答案

分析:上面的算法一个缺点在于需要循环遍历32位,书中的思路是这样的:吧一个整数减去1,在和原整数做与运算,会吧该整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

代码如下:

 public int NumberOf1(int n){
	int count= 0;
        while(n != 0){
            count++;
            n= n&(n-1);
        }
        return count;
    }



学习总结:

1、把整数右移一位和把整数除以2在数学上是等价的,但是除法的效率要比移位运算低得多,在实际编程中应尽可能滴用移位运算替代乘除法运算。

2、一个负数的补码为其对应正数的所有位取反后加1。

3、把一个整数减去1之后再和原来的整数做按位与运算,即n=n&(n-1),得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。

     如题:用一条语句判断一个整数是不是2的整数次方。


if((n&(n-1) == 0)//说明有且仅有1位为1,即可以被2整除
	return true;



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值