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

如何在Tcl中组合位字段以生成单个64位值?,tcl,Tcl,我们将单独的参数传递到一个必须组合成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

我们将单独的参数传递到一个必须组合成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

如果将值1到值6传递到Tcl中的一个proc中,如何将它们组合成一个64位值,然后将该64位值的上32位和下32位存储到单独的变量中?

如果这些值都在要插入的字段范围内,你可以把它们移到一起

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)}]
设置值0

设置值[expr{$value|($value1也可以使用二进制字符串,以及
格式
扫描
,但格式说明符相当长……您建议如何将64位值拆分为两个32位值?我想可以进行相同的位移位,尽管我不确定在tcl中如何进行右移位,因为我们最终可能需要sign扩展。您前面回答的问题中的方法可用于将64位值拆分为两个32位值,并将这两个值分别存储在不同的变量中。我不确定从编程角度看是否存在“更好”即更有效的方法