输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
1. 分析
二进制运算相关:考虑位运算。
一个二进制数字有多少个1,考虑与运算(&),且是n&(n-1),这样进行一次操作就可以去掉最末尾的那个1重复下去,就可以去除掉所有的1。
举个例子:一个数n用二进制表示为 1100,n-1为1011,n&(n-1) = 1000,去除掉了n这个数的最末尾的那个1;再来一次,再将1000减一,变成了0111,再进行与运算,得到0000去除掉了最后一个唯一的1,这样直到n == 0,才结束运算,最后得到1的个数为2。
2. 用C++写出逻辑:
int NumberOf1(int n) {
int countOf1 = 0;
while(n != 0 ){
countOf1++;
n = n & (n - 1);
}
return countOf1;
}
3. 另解:bitset的使用
bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充
string s = "100101";
bitset<10> bitset3(s); //长度为10,前面用0补充
char s2[] = "10101";
bitset<13> bitset4(s2); //长度为13,前面用0补充
cout << bitset1 << endl; //0000
cout << bitset2 << endl; //00001100
cout << bitset3 << endl; //0000100101
cout << bitset4 << endl; //0000000010101
bitset<8> foo ("10011011");
cout << foo.count() << endl; //5 (count函数用来求bitset中1的位数,foo中共有
5个1
cout << foo.size() << endl; //8 (size函数用来求bitset的大小,一共有8位
cout << foo.test(0) << endl; //true (test函数用来查下标处的元素是0还是1,
并返回false或true,此处foo[0]为1,返回true
cout << foo.test(2) << endl; //false (同理,foo[2]为0,返回false
cout << foo.any() << endl; //true (any函数检查bitset中是否有1
cout << foo.none() << endl; //false (none函数检查bitset中是否没有1
cout << foo.all() << endl; //false (all函数检查bitset中是全部为1
故可以使用:
int NumberOf1(int n) {
bitset<32> bit(n);//将其初始化为 32 位,不足 32 位的前面补齐即可
return bit.count();// 返回其中为 1 的个数
}