剑指offer的66题之第11题:二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
代码:
1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 unsigned int flag=1; 5 int count=0; 6 while(flag) 7 { 8 if(n&flag) 9 count++; 10 flag=flag<<1; 11 } 12 return count; 13 } 14 };
注:
1、按位与操作:&
两个正数:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。
两个负数:
a=-2;//a的补码1111 1111 1111 1110
b=-3;//b的补码1111 1111 1111 1101
c=a&b;//c的补码1111 1111 1111 1100
若是两个负数,则是按二进制补码形式进行按位与。所得结果若用有符号整型变量存储,则内部形式仍看作二进制补码。如果用格式符%d输出,输出结果为十进制真值(不应该称为十进制原码,将带符号位的机器数对应的真正数值称为机器数的真值)。
一个正数一个负数:
short a=-109;//补码 1111 1111 1001 0011 ,原码 1000 0000 0110 1101
short b=255
c=a&b //149
2、移位操作
flag=flag << 1;
移位完成后需要赋值给flag否则仍然为1;
3、while死循环
条件是遍历所有位数(审题:负数为补码求1个数),所以就用flag,类型为无符号整型,超过位数不计!
总结:
https://blog.csdn.net/sinat_35121480/article/details/53510793
https://blog.csdn.net/hnlyyk/article/details/47804885
https://blog.csdn.net/huangquanlong/article/details/79170101