【发布时间】:2021-03-10 10:00:27
【问题描述】:
我正在寻找将以下 c++ 函数转换为 Rust 的解决方案
uint32_t reverseBits(uint32_t n) {
static constexpr array<uint8_t, 256> table{[]() constexpr{
constexpr size_t SIZE = 256;
array<uint8_t, SIZE> result{};
for (size_t i = 0; i < SIZE; ++i)
result[i] = (i * 0x0202020202ULL & 0x010884422010ULL) % 0x3ff;
return result;
}()};
但是:
- 我不能使用
#![feature(const_fn)],因为#![feature] may not be used on the stable release channel。 - 我也不能使用 build.rs 和 cargo
- 我考虑过使用macro_rules!但我找不到一个非常简单的示例来在循环中进行预计算,例如:
for (size_t i = 0; i < SIZE; ++i)
result[i] = (i * 0x0202020202ULL & 0x010884422010ULL) % 0x3ff; // reverse bits
注意:我尝试将完整的 c++ 代码转换为 Rust,不幸的是,该表是在运行时计算的:
pub fn reverse_bits(x: u32) -> u32 {
let table: [u32; 256];
for i in 0..10 {
table[i] = ((i as u64 * 0x0202020202 as u64 & 0x010884422010 as u64) % 0x3ff) as u32;
}
return (table[x & 0xff] << 24) | (table[(x >> 8) & 0xff] << 16) |
(table[(x >> 16) & 0xff] << 8) | (table[(x >> 24) & 0xff]);
}
也遇到the type[u32] cannot be indexed by u32...
我任何人都知道如何在编译时构建一个具有 256 个 u32 值的数组,其中每个值都等于 (index * 0x0202020202ULL & 0x010884422010ULL) % 0x3ff;,这将非常有帮助!
【问题讨论】:
标签: rust