如何组合 Tcl 中的位字段以生成单个 64 位值?

How to combine bit fields in Tcl to generate a single 64 bit value?

我们将单独的参数传递给一个必须组合成 64 位值的函数。此后高32位和低32位写入系统中的不同地址。传入的参数甚至可以跨 32 位边界存在,例如跨 30 到 40 位,这使得问题有点棘手。

示例,

value1 across bits 0 to 13
value2 across bits 23 to 24
value3 across bits 25 to 25
value4 across bits 26 to 40
value5 across bits 41 to 50
value6 across bits 51 to 54
the remaining bits 54 to 63 are unused in this case

假设 value1 到 value6 已经被传递到 Tcl 中的一个 proc 中,如何将它们组装成一个 64 位值,然后将这个 64 位值的高 32 位和低 32 位存储到单独的变量中?

如果值都在要插入的字段范围内,您可以将它们移动并 OR-them 一起。

set value 0
set value [expr {$value | ($value1 << 0)}]
set value [expr {$value | ($value2 << 23)}]
set value [expr {$value | ($value3 << 25)}]
set value [expr {$value | ($value4 << 26)}]
set value [expr {$value | ($value5 << 41)}]
set value [expr {$value | ($value6 << 51)}]

如果它们不一定在范围内,您需要在移动前屏蔽掉 out-of-range 位。

请注意,您需要不需要特殊操作来跨越字节或字边界。如果你想要一个有数千个地方宽的位域,你可以拥有它。 (Tcl 的整数通常“尽可能宽”并且没有技术上限,直到您 运行 陷入内存管理问题。)