0
;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

この関数は、32 の位のビットをカウントするために 33 番目のビットが必要なようです。

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 ビットが理想的ですが)。この関数を修正する最善の方法は何ですか?

4

1 に答える 1