內容介紹
- 1 解法1
- 2 解法2
- 3 妙解(拓展思維)
1 解法1
首先計算二進制位1的個數我們可以直接從二進制角度去考慮,我們可以用&運算子來實作,當一個數與1進行&操作,只有當這個數二進制位最右邊位為1的時候結果才為1,利用這個特性,我們將數的每一位都跟1進行&操作,若為1則計數器加1,然后進行右移操作再進行&操作,直到將32個位元位都計算一遍,所以我們需要一個回圈來實作,
代碼實作:
int Count_bit(int n)
{
int i = 0;
int count = 0;
while (i < 32)
{
if (1 == (n >> i & 1))
{
count++;
}
i++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Count_bit(n);
printf("%d\n", ret);
return 0;
}


由于我們是在二進制角度去計算,所以無論是正數還是負數都能計算出正確結果,
2 解法2
除了直接利用二進制位進行計算之外,我們還可以通過%2再/2的操作來計算,相當于通過十進制數計算出轉換成二進制的每一位的值,每計算出一位然后跟1比較就可以得到二進制為中1的個數,
代碼實作:
int Count_bit(unsigned int n)
{
int i = 0;
int count = 0;
while (n)
{
if (1 == n % 2)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Count_bit(n);
printf("%d\n", ret);
return 0;
}

注意:函式形參型別為unsigned int型別,若為int型別那么傳入一個負數的時候if條件不滿足,count不會進行加一,n/=2結果為0直接跳出回圈回傳0,這段代碼要想實作功能就得把負數轉換為二進制位對應的一個正數(即將負數當成一個無符號數看待)
3 妙解(拓展思維)
當一個數n與比它小1的數(n-1)進行&操作時,那么這個數二進制位就會少一個1,

代碼實作:
int Count_bit(int n)
{
int i = 0;
int count = 0;
while (n)
{
n &= (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Count_bit(n);
printf("%d\n", ret);
return 0;
}

總結:在這種方式中,資料的二進制位元位中有幾個1,回圈就回圈幾次,而且中間采用了位運算,處理起來比較高效,
作者水平有限,若文章有任何問題歡迎私聊或留言,希望和大家一起學習進步!!!
創作不易,希望大家👍支持下,謝謝大家🙏
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/298698.html
標籤:其他
下一篇:【演算法入門04】替換空格
