位运算通常针对无符号数,当有负数出现的情况时需予以特殊考虑。
1) 判断二进制中1的个数:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
本题有两种方法:1. 通过右移操作逐位与1比较判断该位是否为1。考虑到可能出现负数情况,在使用移位操作前需将输入的整数转换为 unsigned int 类型,再做后续操作。
2. 通过 n&(n-1) 操作逐渐去除低位的1,并将所需操作次数累加即得到1的个数。
上述两种方法中,方法2所需的计算次数较少,更快捷。
方法1代码(时间复杂度O(log n)):
class Solution { public: int NumberOf1(int n) { int cnt = 0; unsigned int n1 = n; while(n1) { cnt += (n1&1); n1 >>= 1; } return cnt; } };
方法2代码时间复杂度(O(1)):
class Solution { public: int NumberOf1(int n) { int cnt = 0; while(n) { n = n & (n-1); //该式含义去掉最右端的一个1; //可用于判断一个数是否为2^n(结果为0则是) ++cnt; } return cnt; } };2)待更新......