;if A is a 9 bit quantity, B gets number of 1's (Schroeppel)
IMUL A,[1001001001] ;4 copies
AND A,[42104210421] ;every 4th bit
IDIVI A,17 ;casting out 15.'s in hexadecimal
這個函數似乎需要第33位來計算32位的位。HAKMEM漢明重量bithack有一個錯誤,任何方式來保存它?
uint32_t i = 0b11101011;
uint32_t u = i * (uint32_t)01001001001;
uint32_t x = u & (uint32_t)042104210421;
v = x % 017;
std::cout << "i: " << std::bitset<8>(i) << ", u: " << std::bitset<32>(u) <<
", x: " << std::bitset<32>(x) << ", v: " << v << std::endl;
給出:
i: 11101011
u: 01011011101011011101011011101011
x: 00010001000000010001000000000001
v: 5
但是:
uint64_t v = i;
uint64_t u = v * (uint64_t)01001001001;
uint64_t x = u & (uint64_t)042104210421;
v = x % 017;
std::cout << "i: " << std::bitset<8>(i) << ", u: " << std::bitset<33>(u) <<
", x: " << std::bitset<33>(x) << ", v: " << v << std::endl;
給出:
i: 11101011
u: 101011011101011011101011011101011
x: 100010001000000010001000000000001
v: 6
由於非常低的數字絕對指令(儘管昂貴IDIV功能,指令的數量是在我的用例中重要),我想使用這個或類似的功能。但我不太瞭解模數15是如何工作的。
我只需要計數多達7位(雖然8將是理想的)。修復此功能的最佳方法是什麼?
從[這篇文章](http://www.hackersdelight.org/corres.txt)的項目8有幫助嗎? – njuffa
@njuffa不是真的,它是一個完全不同的算法? – OmnipotentEntity
我瞭解你的問題,尋找基於HAKMEM的代碼計數1位,是不是這樣?項目8下的'popcnt32()'將計算一個整數實體中的1位,最大爲32位,同時避免了昂貴的分割。 – njuffa