二进制中1的个数

旧巷老猫 提交于 2019-11-28 03:47:22

题目:

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

 

解法一:就是让数字的每一位与1做位运算。

然后有一种做法把输入的的数字不断右移再和1做与运算来判断该位是否为1是错误的。

比如0x80000000,把其右移一位得到的是0xC0000000,不是0x40000000,因为在移位的时候会在高位补充符号位置。

所以应该把1来左移,然后再和原来的数做与运算。

比如判断1110(数字-6)的1的个数,首先1110 & 1 把1左移一位然后与运算

然后1110 & 10(即数字2)

然后1110 & 100

然后1110 & 1000

这样去判断1的个数


class Solution {
public:
	int  NumberOf1(int n) {
		int ans = 0;
		unsigned int opt = 1;
		while(opt)//opt一直左移低位补零,当opt为0结束循环
		{
			if(n & opt)
				ans++;//1的个数增加
			opt<<=1;
		}
		return ans;
	}
		 
			
			
};

 

 

解法二:将一个整数减去1,再和原来整数做与运算,会把最右边的1变成0.有多少个1就可以这样操作多少次


class Solution {
public:
	int  NumberOf1(int n) {
		int ans  = 0;
        while(n)
        {
            ans++;
            n = (n -1) & n;
        }
        return ans;
        
	}
		 
			
			
};

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!