如何在 TCL 中设置、清除和切换单个位?

How do you set, clear, and toggle a single bit in TCL?

TCL scripting中,如何以可靠的方式执行这些步骤?

  1. x中的位n设置为'1'
  2. 清除 x 中的第 n 位到 '0'
  3. x
  4. 中切换位 n
  5. 仅在 x 中提取位 n
  6. x 中的位 n 更改为值 y

TClexpr 的依赖使得任何类型的数学都有些混乱。

假设我们正在谈论切换编码为整数的值中的单个位,这很容易。这些都是进行位操作的所有经典方法(您也可以在许多其他语言中做一些非常相似的事情):

proc setBit {var bit} {
    upvar 1 $var v
    # OR
    set v [expr {$v | (1 << $bit)}]
}
proc clearBit {var bit} {
    upvar 1 $var v
    # AND NOT
    set v [expr {$v & ~(1 << $bit)}]
}
proc toggleBit {var bit} {
    upvar 1 $var v
    # XOR
    set v [expr {$v ^ (1 << $bit)}]
}
proc testBit {var bit} {
    upvar 1 $var v
    # select with AND and test
    return [expr {($v & (1 << $bit)) != 0}]
}
proc setBitTo {var bit value} {
    upvar 1 $var v
    set v [expr {$value ? $v | (1 << $bit) : $v & ~(1 << $bit)}]
}

请注意,当前 Tcl 版本中没有整数的最大大小(存储扩展到 space 需要的任何大小)。机器字大小的东西只会更有效率。

你也可以使用binary scan将数据块转换成01的字符串,然后在使用binary format转换回来之前对其进行字符串操作,但其实更尴尬