1。最簡單的方法:使用bitset
[cpp]view plain
copy
unsigned count (unsigned u)
2。使用移位迴圈測試
[cpp]view plain
copy
unsigned count (unsigned u)
return
ret;
}
3。使用分治法
若f(n),b(n)表示 高/低 n位1出現的次數,則有f(32)=f(16)+b(16)。依照此公式依次推下去,反過來從小到大的組合起來便得到這道提的答案了。
[cpp]view plain
copy
unsigned count(unsigned u)
解析:這個二分法的原理:
用8位二進位制數來做示範好了,例如 u = 10110011。
10110011 (原數)
00010001 //每兩位取1位,即取偶數字, u & 01010101
01010001 //取奇數字並右移一位, (u >> 1) & 01010101
--------------(紅色轉化十進位制為2,再看原數低二位上的1共有2個,同理其它組分別為0,2,1,從低到高看)
01100010 //上面兩數相加,賦值給u,注意每兩列相加的結果不會進製到第三列
00100010 //每四位取低兩位, u & 00110011
00010000 //每四位取高兩位並右移兩位, (u >> 2) & 00110011
--------------(整個紅色轉化十進位制為2,再看原數低四位上的1共有2個,同理高四位為3)
00110010 //上面兩數相加,賦值給u
00000010 //每八位取低四位, u & 00001111
00000011 //每八位取高四位並右移四位,(u >> 4) & 00001111
--------------(整個紅色轉化十進位制為5,再看原數所有位上的1共有5個)
00000101 //上面兩數相加,賦值給u
最終結果 u = 5。
所以其實就是不斷累加的過程
十六進製制轉換成十進位制 二進位制
十六進製制轉二進位制 public string htob string a 二進位制轉十六進製制 public string btoh string a 任意進製數轉為十進位制數 public string tod string a,int b return string.valueof r 將十...
十進位制轉換成二進位制,八進位制,十六進製制
好久沒有寫過c 了。看到以前課本上有這樣一道題 列印整數1到156的二進位制 八進位制 十六進製制和十進位制對照表。很基礎的知識,權當溫習下知識。如下 author finux time sat 20 sep 2008 02 25 03 pm cst filename main.cpp descri...
將有符號十進位制數轉換成二進位制
function numbin dec2binpn numdec,n 判斷輸入數正負 if numdec 0 正數轉二進位制 numbin1 dec2bin numdec,n else 負數轉二進位制 numbin1 dec2bin abs numdec n l1 length numbin1 nu...