每天一道算法题(2)——求整数的2进制表示中1的个数

    xiaoxiao2021-03-25  78

    Solution1:整数往右移,与1按位与

            不适用负数。因为负数的移位自动填补1,程序陷入死循环

    [cpp]  view plain  copy   int NumberOf1_Solution1(int i)   {         int count = 0;         while(i)         {               if(i & 1)                     count ++;                  i = i >> 1;         }            return count;   }  

    Solution 2:1往左移,与数相与

            注意flag定义为unsigned int

    [cpp]  view plain  copy   int NumberOf1_Solution2(int i)   {         int count = 0;         unsigned int flag = 1;         while(flag)         {               if(i & flag)                     count ++;                  flag = flag << 1;         }            return count;   }  

     Solution3:取反规律 

          任意一个数减1,结果是二进制表示中,最后一个1及其之后位取反。

    [cpp]  view plain  copy   int NumberOf1_Solution3(int i)   {         int count = 0;            while (i)         {               ++ count;               i = (i - 1) & i;         }            return count;   }        适用负数,但是负数实际计算的1的个数为其补码中1的个数。   
    转载请注明原文地址: https://ju.6miu.com/read-15596.html

    最新回复(0)