【发布时间】:2019-04-15 15:21:08
【问题描述】:
我有一个 uint64_t[4] 数组,我需要生成一个掩码, 这样数组,如果它是一个 256 位整数,则等于 (1
我想出的最好的东西是无分支的,但它需要很多指令。它在 Zig 中,因为 Clang 似乎没有暴露 llvm 的饱和减法。 http://localhost:10240/z/g8h1rV
有没有更好的方法来做到这一点?
var mask: [4]u64 = undefined;
for (mask) |_, i|
mask[i] = 0xffffffffffffffff;
mask[3] ^= ((u64(1) << @intCast(u6, (inner % 64) + 1)) - 1) << @intCast(u6, 64 - (inner % 64));
mask[2] ^= ((u64(1) << @intCast(u6, (@satSub(u32, inner, 64) % 64) + 1)) - 1) << @intCast(u6, 64 - (inner % 64));
mask[1] ^= ((u64(1) << @intCast(u6, (@satSub(u32, inner, 128) % 64) + 1)) - 1) << @intCast(u6, 64 - (inner % 64));
mask[0] ^= ((u64(1) << @intCast(u6, (@satSub(u32, inner, 192) % 64) + 1)) - 1) << @intCast(u6, 64 - (inner % 64));
【问题讨论】:
-
到 localhost 的链接有什么用?
-
您为什么架构编程?您可以使用哪些指令集扩展?你用什么语言编程?
-
@fuz "你用什么语言编程?" Zig,如问题中所述(但由于某种原因不在标签中)
-
|_, i|- 这是什么编程语言?编辑: Zig .. 没听说过,但没关系.. 如果我正确阅读了你的描述,你只需要 255 个不同的面具 - 你考虑过查找表吗? -
@ShawnLandden 鉴于您的问题被标记为
assembly,看来您可能需要优化的汇编代码。是这样吗?如果是,请告诉我您正在编程的架构和指令集扩展。如果不是,请考虑删除assembly标签。
标签: c assembly bit-manipulation bit zig