【发布时间】:2024-11-17 07:40:01
【问题描述】:
;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 位的位。
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 位比较理想)。修复此功能的最佳方法是什么?
【问题讨论】:
-
this write-up 的第 8 项有帮助吗?
-
@njuffa 不是真的,这是一个完全不同的算法?
-
我将您的问题理解为寻找基于 HAKMEM 的 1 位代码,不是这样吗?第 8 项下的
popcnt32()将在一个最大为 32 位的整数实体中计算 1 位,同时避免昂贵的除法。 -
我看不出这种方法是如何修复的,它可能是为当时仍然常见的 36 位文字机器之一设计的。在您的用例中,您可以容忍的最大指令数是多少?
-
11.4 根据我的计算,然后将弹出计数简单地存储在寄存器中并手动更新它会更好。硬件是MIPS,所以这个算法是5条指令
标签: bit-manipulation hammingweight