方法一:
根据整型数除法特点, 通过除2判断末位是否为1
//通过余数判断末位是否为1
int Count(int n) {
int res = 0;
while(n) {
if(n % 2 == 1)
++ res;
n /= 2;
}
return res;
}
用位运算, 通过和1做与运算判断末位是否为1
//位操作, 通过和1做与运算, 判断末位是否为1
//时间复杂度为log2(n), 等于该整数的二进制表示位数
int Count(int n) {
int res = 0;
while(n) {
res += (n & 1);
n >>= 1;//右移1位
}
return res;
}
方法三:
在方法二的基础上优化时间复杂度, 从log2(n)到o(M)
//时间优化, 复杂度为o(M)
//每次通过和(n-1)做与运算,将最低位的1变为0(若一个数为2的n次方,则只有一个1)
int Count(int n) {
int res = 0;
while(n) {
n &= (n - 1);
res ++;
}
return res;
}
练习1
判断一个数是否为奇数
bool judge(int n) {
return (n & 1) ? true : false;
}
练习2
给定两个二进制表示的正整数A, B, 将A变成和B一样需要改变多少位
思路:对A^B的结果求1的位数(异或运算)
int Count(int n, int p) {
int tmp = n ^ p;
int res(0);
while(tmp) {
++ res;
tmp &= (tmp - 1);
}
return res;
}
参考书籍:编程之美