输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
1.右移肯定是不行 因为若是有符号数中的复数,那么则进入死循环
2.左移flag 让n保持不动;
可能有疑惑:while(flag)不是一个死循环了吗??
毕竟flag左移一直是大于0;
int NumberOf1(int n) { unsigned int rc=1; int count=0; //int num=0; while(rc) { if(n&rc) count++; rc=rc<<1; //num++; //cout<<rc<<"num"<<num<<endl; } return count; }
看调试结果: 证明了循环的次数等于 整数二进制的位数 比如int 就循环32次 (注意:1左移32次后 就越界int了等于0!! 以前都不知道)
2num1
4num2
8num3
16num4
32num5
64num6
128num7
256num8
512num9
1024num10
2048num11
4096num12
8192num13
16384num14
32768num15
65536num16
131072num17
262144num18
524288num19
1048576num20
2097152num21
4194304num22
8388608num23
16777216num24
33554432num25
67108864num26
134217728num27
268435456num28
536870912num29
1073741824num30
2147483648num31
0num32
2.改进后:
int NumberOf1(int n) { int count=0; while(n) { count++; n=n&(n-1); } return count; }