首页 > 解决方案 > 如何在 Tcl 中组合位域以生成单个 64 位值?

问题描述

我们将单独的参数传递给必须组合成 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 位存储到单独的变量中?

标签: tcl

解决方案


如果这些值都在它们要插入的字段范围内,您可以将它们移位并将它们或它们一起。

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)}]

如果它们不一定在范围内,则需要在移位之前屏蔽超出范围的位。

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


推荐阅读