输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法一
把一个整数n减去1,再和原来的整数与运算,会把该整数的最右边的1变成0,
那么,一个整数的二进制中有多少个1,就可以进行多少次这样的操作。
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
}
解法二
public class Solution {
public int NumberOf1(int n) {
int count = 0;
for (int i = 0; i < 32; i++) {
if (((n>>>i)&1)==1) {
count++;
}
}
return count;
}
}
>>> 运算符用 0 填充高位;>> 运算符用符号位填充高位
解法三
public class Solution {
public int NumberOf1(int n) {
int m_1 = 0x55555555;//16对01
int m_2 = 0x33333333;//8对0011
int m_4 = 0x0f0f0f0f;//4对00001111
int m_8 = 0x00ff00ff;//2对0000000011111111
int m_16 = 0x0000ffff;//16个1 1111111111111111
int b = (n & m_1) + ((n >> 1) & m_1);
int c = (b & m_2) + ((b >> 2) & m_2);
int d = (c & m_4) + ((c >> 4) & m_4);
int e = (d & m_8) + ((d >> 8) & m_8);
int f = (e & m_16) + ((e >> 16) & m_16);
return f;
}
}