【发布时间】:2021-11-17 04:09:27
【问题描述】:
在here,定义了这个函数:
template <typename T, typename = std::enable_if_t<is_uint32_v<T> || is_uint64_v<T>>>
inline T reverse_bits(T operand, int bit_count)
{
// Just return zero if bit_count is zero
return (bit_count == 0) ? T(0)
: reverse_bits(operand) >> (sizeof(T) * static_cast<std::size_t>(bits_per_byte) -
static_cast<std::size_t>(bit_count));
}
在later point,该函数用于将元素以打乱的方式存储到数组中:
inv_root_powers_[reverse_bits(i - 1, coeff_count_power_) + 1].set(power, modulus_);
这样做的理由是合并内存访问。但是,我不知道为什么这样的随机值会使内存访问更容易。例如,这里有一些值:
reverse_bits(3661, 12) +1 = 2856
reverse_bits(3662, 12) +1 = 1832
reverse_bits(3663, 12) +1 = 3880
reverse_bits(3664, 12) +1 = 168
reverse_bits(3665, 12) +1 = 2216
reverse_bits(3666, 12) +1 = 1192
reverse_bits(3667, 12) +1 = 3240
reverse_bits(3668, 12) +1 = 680
reverse_bits(3669, 12) +1 = 2728
好像东西存放得很远。
【问题讨论】:
-
某处有
reverse_bits(operand)的1个参数版本 -
请不要在 C++ 问题的代码块中使用
=来表示“相等”。 -
@RichardCritten 这只是 MSB 到 LSB 的反转等等,所以 1010 是 0101