天天看點

【C語言】求一個整數存儲在記憶體中的二進制中1的個數。

**比如:15 的二進制數位0000 0000 0000 0000 0000 0000 1111 ,則結果傳回4

**

程式原型:int count_one_bits(unsigned int value)(說明:采用unsigned是int類型的-1中1的個數位32,-1是負數,在計算機中存的時補碼)

(1)方法一

<類比于十進制>

例如:輸出123 的每一位的數字

123%10=3

123/10=12  12%10=2

12/10=1       1%10=1

輸出十進制數字的每一位采用/10 ,%10的方法,

同樣地類比于十進制,二進制數就采用/2 ,%2 的方法。

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 while (num != 0)
 {
  if (num % 2 == 1)
  {
   count++;
  }
  num = num / 2;
 } 
 return count;//傳回count次數
}
int main()
{
 int num ;
 printf("請輸入整數:");
 scanf("%d", &num);
 printf("整數中1的個數為:%d\n", count_one_bits(num));
 return 0;
}
           

(2)方法二

<用單目操作符&> (正常解法)

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 int i = 0;
 for (i = 0; i < 32; i++)
 {
  if ((num >> i) & 1 == 1)//num右移i位與1相與,看結果是否為1.如果結果為1,num第i位為1,否則為0.總共移動32次.
  {
   count++;
  }
 }
 return count;//傳回count次數
}
int main()
{
 int num;
 printf("請輸入整數:");
 scanf("%d", &num);
 printf("整數中1的個數為:%d\n", count_one_bits(num));
 return 0;
}
           

(3)方法三

例如:求二進制數字7中1的個數(為了友善,我隻寫最後8位)

            0000 0111    7

         & 0000 0110    6

            0000 0110    6(結果)

         & 0000 0101    5

            0000 0100     4(結果)

         & 0000 0011    3

            0000 0000     0

二進制數7減一之後與其相與,相與三次之後為0,且7的1的個數為3。

由此可得,當num不為0時,循環num&(num-1),直到最後相與結果為0。則相與的次數就是二進制數num中1的個數。

#define _CRT_SECURE_NO_WARNINGS 1
int count_one_bits(unsigned int num)
{
 int count = 0;
 int i = 0;
 while (num!=0)
  {
  num = num&(num - 1);
  count++;
  }
 return count;//傳回count次數
}
int main()
{
 int num;
 printf("請輸入整數:");
 scanf("%d", &num);
 printf("整數中1的個數為:%d\n", count_one_bits(num));
 return 0;
}
           

以上三種代碼運作結果都如下所示:

【C語言】求一個整數存儲在記憶體中的二進制中1的個數。

繼續閱讀