如何以最快的速度計算出乙個二進位制數中1的個數

2021-07-24 03:17:26 字數 975 閱讀 4298

題目:如何以最快的速度計算出乙個二進位制數中1的個數

重點在於,這裡有十億或萬億個int數字,怎樣做才能優化演算法呢?

解答:統計乙個位元組序列中1的個數,我首先想到的是最簡單,把這個數每次右移一位,然後與0x01邏輯與進行統計,相當於總共將真個位元組序列遍歷了一遍。然而仔細想想,乙個十億或萬億的位元組序列,能存到乙個數(或稱為變數)中?必然不可以,因此這是陷阱所在。

while(num)

}

深入思考,既然是位元組序列,那我解釋成任何資料型別都是可以的啊,我可以按照32位機器的int大小,比如4個位元組來把這麼長的位元組序列讀到乙個個的int值中,然後統計每個int值的位中1的個數,加起來就可以了。

方法1:

8bit靜態表查詢法 precompute_8bit

static int bits_in_char [256] = ;

int bitcount (unsigned int n)

使用靜態陣列表,列出所有8bit(256個)無符號數含有bit1的個數。將32bit 的n分4部分,直接在表中找到對應的bit1的個數,然後求和。

顯然,犧牲了時間換取了空間。

方法2:

//源自 微軟 的一道面試題

int getnumofone(int x)

return

count;

}//原理:乙個數減去1,則這個數的二進位制數中最後乙個1及其後的數字取反。

// x & (x - 1) 為它的二進位制數中少乙個1

方法3:

//以32位為例子:

如何精確計算出乙個演算法的CPU執行時間

在程式中嵌入彙編語句,直接讀出cpu的機器週期。你需要多精確?gettickcount可以到18 20ms進度 timegettime可以到1ms精度 當然這些都不是c or c 標準支援的。那麼就要祭出最牛奔的方法,直接讀取cpu開機以來執行的機器週期數,一條彙編指令 rdtsc 就是 read ...

乙個js程式計算出划算的雲主機頻寬

在選擇某阿雲與某騰雲的網路,或者是其它網路的時候,它們的頻寬 簡直是貴的驚人,一般主機提供商都會給大家兩個選擇,乙個是頻寬包月,有限制,另乙個是按量沒有限制,如何才能選擇到適合自己主機的頻寬呢?也是就把 最小化,寬頻最大化。let cons let pretotalmoney 0 let speed...

計算出賬的上乙個入賬時間差

計算各個商戶每一筆出款距離其上一筆入款的時間間隔 分鐘 with tablea as select 1 id,date 2018 1 1 1 dt,0 off from dual union all 0代表入賬 1 代表出賬 select 1 id,date 2018 1 1 0.5 dt,0 of...