位运算相关的几道题(二进制中1的个数)

位运算通常针对无符号数,当有负数出现的情况时需予以特殊考虑。

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)待更新......

猜你喜欢

转载自blog.csdn.net/qq_24153697/article/details/79699568
今日推荐