【发布时间】:2018-01-10 16:15:55
【问题描述】:
我有一些无符号 16 位整数 s 我想映射到一个无符号 32 位整数 r,这样s 中的每个翻转位最多翻转一个(给定)位r -- 只是0..16 和0..32 之间的映射。所以我们可以把它看作一个矩阵方程
Ps = r
其中 P 是 32 x 16 布尔矩阵,s 是 16 x 1 布尔向量,r 是 32 x 1 布尔向量。我有一种直觉,我缺少一些超级简单的技巧。重要提示:目标机器是 16 位单片机!
这是我能做的最好的:
static u16 P[32] = someArrayOrWhatever();
u32 FsiPermutationHack(u16 s) {
u32 r;
for (u16 i = 0; i < 32; i++)
{
r |= ((u32)((P[i] & s) > 0) << i);
}
return r;
}
基本原理是:r 的第 i 位为 1 当且仅当(P[i] & s) != 0x0000。我太愚蠢了,无法反汇编东西,但我猜如果我们不必做那个愚蠢的u32演员的话,这将是大约100条指令。但是话又说回来,也许编译器会为我们自动将循环分成两部分,在这种情况下,它对我们来说看起来相当不错。
为切线道歉,只是想我会分享我尝试的解决方案——你有更好的解决方案吗?
【问题讨论】:
-
数学描述很好,但有点晦涩难懂。能举个例子吗?
-
顺便说一句,请注意,您的文件范围数组
P无法通过函数调用进行初始化,如您的示例所示。在 C 中,函数调用可能只出现在函数体内。 -
无论如何,您是说函数
FsiPermutationHack()正确实现了您想要的计算,但您正在寻找改进?在这种情况下,除非您对代码有特定问题,否则该问题可能更适合Code Review。 -
也许更适合代码审查交流?
-
哦,顺便说一句,您需要在开始处理数组之前初始化变量
r。