求二進位制數中1的個數(程式設計之美)
求二進位制數中1的個數
題目描述:對於一個位元組1BYTE = 8 bits的無符號變數,求其二進位制表示中1的個數,要求演算法的執行效率儘可能高。
題目分析:可以吧這個問題轉化為判斷這個數的最後1位數是否等於1,然後逐漸往右移位,不斷判斷下去,直到該數為零。
按照這種分析,那麼就有兩部分需要做:
1)判斷最後一位是否為零;
2)如果右移位。
這樣就有三種思路。
思路一:1)可以通過除以2,看餘數是否等於0/1實現;2)可以通過除以2;
思路二:1)可以通過和0x01按位與,如果結果為1就表示最後一位為1,否則就是0;2)可以右移位實現除以2;
思路三:1)可以通過v & (v-1)來實現,充分利用了相鄰數最後一個二進位制位相異的特點;2)同思路2.
程式碼如下:
// 思路2
#include<iostream>
typedef unsigned char BYTE; //BYTE型別在C++中是沒有的,其實它就是無符號字元型,人們一般關注它的長度,而不是型別
using namespace std;
int count(BYTE v)
{
int num = 0;
while(v)
{
num += v&0x01; //按位與
v >>= 1; //右移位
}
return num;
}
int main()
{
BYTE x = 255; //BYTE型別只有8bits, 所以最大隻能是255, 0-255
cout<<count(x)<<endl; //輸入1的個數
return 0;
}
其中的註釋幫助理解BYTE型別。
// 思路3
#include<iostream>
typedef unsigned char BYTE;
using namespace std;
int count(BYTE v)
{
int num = 0;
while(v)
{
//num += v&0x01;
//v >>= 1;
v &= (v-1);
num++;
}
return num;
}
int main()
{
BYTE x = 255;
cout<<count(x)<<endl;
return 0;
}
可以看出 v &= (v-1); 這樣子做就可以省去了右移位的操作,這樣更加簡單。
時間複雜度方面:
思路2,時間複雜度和v的二進位制位數有關,而一個數的二進位制的位數為logv,故O(logv);
思路3,直接和v中1的個數有關,是O(M).
思路1的和思路2的一樣,不過做法比思路2要大,因為位操作比除法和餘法要效率來的高~
參考:
關於BYTE:
http://bbs.csdn.net/topics/310267652
http://www.cxybl.com/html/bcyy/c/201109073136.html
《程式設計之美》
相關文章
- 位運算--求一個 數二進位制中1的個數
- 求一個整數的二進位制中1的個數
- 二進位制中1的個數
- 求一個數的二進位制數中所含1的個數的程式碼實現
- 【c語言】統計一個數二進位制中的1的個數C語言
- 位運算(一):二進位制中1的個數
- 【劍指offer】二進位制中1的個數
- 【刷演算法】二進位制中1的個數演算法
- 題目1513:二進位制中1的個數
- 02_Python學習筆記之統計整數二進位制中1的個數Python筆記
- offer通過--10二進位制中統計1的個數-2
- 劍指 Offer 15. 二進位制中1的個數
- JZ-011-二進位制中 1 的個數
- 二進位制求5個1的格式。。。。
- 查詢數N二進位制中1的個數(JS版 和 Java版)JSJava
- 【劍指offer中等部分4】二進位制中1的個數(java)Java
- 用c語言實現輸入一個十進位制數,計算其轉換為二進位制數後其中包含1的個數C語言
- 二進位制漏洞挖掘之整數溢位
- 根據數字二進位制下 1 的數目排序排序
- 負數的二進位制數問題
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- 三種語言實現計算二進位制中1的個數(C++/Python/Java)C++PythonJava
- 演算法學習記錄九(C++)--->二進位制中1的個數演算法C++
- 知多一點二進位制中的負數
- 力扣 根據數字二進位制下1的數目排序力扣排序
- 1417 二進位制數的大小
- 【c語言】將一個數的二進位制序列逆序,然後輸出逆序之後的二進位制序,所對應的數C語言
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- 二進位制 (小白進軍程式設計師)程式設計師
- JavaScript 二進位制數字轉換為十進位制JavaScript
- java二進位制正數和負數取反Java
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 有趣的二進位制3—浮點數
- js將數字轉換為二進位制、十六進位制或者八進位制程式碼JS
- 用C#實現二進位制的減法(包括二進位制小數)C#
- javascript十進位制數字和二進位制相互轉換JavaScript
- 一看就懂二進位制、八進位制、十六進位制數轉換十進位制
- 計算機中的二進位制計算機