位運算(一):二進位制中1的個數
一、題目:求二進位制中1的個數
請實現一個函式,輸入一個整數,輸出該數二進位制表示中1的個數。
例如:10 二進位制表示為:1010 ,該函式輸出二
二、最初思路:
先檢查二進位制位最右邊一位是否為1,將二進位制位右移一位,這時最右邊一位
變為原來的倒數第二位,再右移一位,依次迴圈運算,直到此數變為0。
怎樣檢查二進位制位最右邊一位是否為1呢?用這個數&1,若結果為0,則是0,否則為1。
三、改進:
1.輸入的數為負數,最高位為1,右移時最高位會填充1,用上述方法則會死迴圈。
思路應修改為:先&1判斷最右邊一位是否為1,然後將1左移一位再&判斷右邊第二位
是否為1,與運算的結果為0,則該位不是1,否則都為1。直到1左移為0結束迴圈.
2.上述思路32位整數需要移動32次,改進為整數中有多少個1就迴圈多少次。
思路應修改為:將一個整數減去1然後與這個整數做與運算,結果恰好將最右邊的1變為0。
例:最低位為1:(1001)&(1000)= 1000
最低位為0:(1010)&(1001)= 1000
四、程式碼實現(編譯器:VS2010 語言: C語言)
#include <stdio.h>
#include <stdlib.h>
int NumberOfOne(int n)
{
int count = 0;
/*方法1:最初思路 未解決負數問題
while(n)
{
if((n&1) == 1)
{
count++;
}
n>>=1;
}*/
/*方法2:改進1 32位整數要迴圈32次
unsigned int flag = 1;
while(flag)
{
if(flag & n)
count++;
flag <<= 1;
}*/
//方法3:終極方法 優化了方法2,有多少1就迴圈多少次
while(n)
{
n &= (n-1);
count++;
}
return count;
}
int main()
{
int num = -10;
//-10在記憶體中的儲存,求-10的補碼
//10000000 00000000 00000000 00001010 ->10
//11111111 11111111 11111111 11110101 ->取反
//11111111 11111111 11111111 11110110 -〉+1
int ret = NumberOfOne(num);
printf("%d\n", ret);
system("pause");
return 0;
}
參考書籍《劍指offer》
謝謝閱讀,如有錯誤,歡迎指出,在此感謝!!!
相關文章
- 位運算--求一個 數二進位制中1的個數
- 二進位制中1的個數
- 二進位制與二進位制運算
- 二進位制、位運算、位移運算
- 求一個整數的二進位制中1的個數
- java二進位制運算十進位制(精確運算)Java
- 有趣的二進位制2—高效位運算
- 【劍指offer】二進位制中1的個數
- 【c語言】統計一個數二進位制中的1的個數C語言
- 【刷演算法】二進位制中1的個數演算法
- 題目1513:二進位制中1的個數
- N位二進位制數加減法運算圖靈機圖靈
- 劍指 Offer 15. 二進位制中1的個數
- JZ-011-二進位制中 1 的個數
- 計算機中的二進位制計算機
- 求二進位制數中1的個數(程式設計之美)程式設計
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 用c語言實現輸入一個十進位制數,計算其轉換為二進位制數後其中包含1的個數C語言
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 第一章:位運算-------輸入浮點數,輸出對應二進位制數
- 二進位制數的運算原理與閘電路實現
- 【劍指offer中等部分4】二進位制中1的個數(java)Java
- offer通過--10二進位制中統計1的個數-2
- 知多一點二進位制中的負數
- 二進位制求5個1的格式。。。。
- 二進位制運算加減乘除+快速冪
- Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 查詢數N二進位制中1的個數(JS版 和 Java版)JSJava
- 求一個數的二進位制數中所含1的個數的程式碼實現
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 進位制詳解:二進位制、八進位制和十六進位制
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- JavaScript 二進位制、八進位制與十六進位制JavaScript