本文共 677 字,大约阅读时间需要 2 分钟。
这道题要判断一个int类型数据的二进制中1的个数。
看到二进制就会联想到位运算符:异或、与、取反、或、左移和右移。 判断1的个数,就会想到与1相与。1实际上是0000…1的简写,所以输入n与1相与实际上就是在判断最后1位是否为1。是结果为1,否结果为0. 每次判断完之后,n向后移动一位,继续判断下一位。 对于正数可以采用以下代码int NumberOf1(int n) { int cnt=0; while(n!=0) { cnt+=n&1; n>>=1; } return cnt; }
但是在负数的时候,这么做会产生一个问题:输入可能为负数。负数和正数的区别在于向右移位的时候,正数左边补0,但是负数为了保持负号,补位的是1,导致循环不停止。这时候就需要把while改为for循环,因为输入的是int类型,总共32位,所以for循环32次.
int NumberOf1(int n) { int cnt=0; for(int i=0;i<32;++i) { cnt+=n&1; n>>=1; } return cnt; }
这样的好处在于不用区分负数和正数,因为只循环32次,没有理会左边补位1还是0.时间复杂度,空间复杂度均为O(1)。
转载地址:http://qndmi.baihongyu.com/