剑指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

 

posted @ 2018-08-31 13:40  BreakofDawn  阅读(64)  评论(0编辑  收藏  举报