2019.9.2
题目:给定一个32位整数,返回该整数二进制形式1的个数。
我开始想把数字转换为2进制看其中1的个数,用的是除2取余,然后发现通过率只有50%,原来是忽略了负数的存在。计算机系统中,数值一律用补码来表示和存储。这里复习一下补码(跟此题无关):正数的补码和原码相同,零的补码唯一00000000,负数的补码是其绝对值的二进制表示所有位取反再加1。这道题的思路是n&(n-1)算法,这个位运算学过,但是没怎么使用过,根本没想起来要用这个。
n&(n-1)表示将数字n的二进制形式中最低位为1的变为0,&是按位与运算符
#include"iostream"
using namespace std;
int main()
{
int n;
cin>>n;
int i = 0;
while(n)
{
n=n&(n-1);
i++;
}
cout<<i;
return 0;
}
算法:n&(n-1)的总结(这个博主总结的很详细,参考学习)