位运算
题目:
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1因此,如果输入9,则该函数输出2。
分析:
tips:负数在移位后仍为负数,最高位为1,1移位后,最高位的符号位仍为1。
数字右移,判断第一位为1的个数,直到数变为零,类似于十进制转二进制的数学算法,但不适用于负数。
修改为,把1左移,每次判断一位,直到1变成0。
代码如下:
int NumberOf1(int n)
{
unsigned int flag = 1;
int count = 0;
while(flag){
if(n & flag)
count++;
flag = flag<<1;
}
return count;
}
第二种,数n,对它作n&(n-1)的操作,会把它二进制中第一个1去掉。比如,
n = 1101,
n-1=1100,
n=n&(n-1)=1100
继续:
n=1100,
n-1=1011,
n&(n-1)=1000
……
直到n变成0;
代码如下:
int numberof1(int n )
{
int count = 0;
while(n){
n = n&(n-1);
count++;
}
return count;
}
声明:题目和程序来自剑指offer,分析和注释自己写的备忘,侵删