如何在 TCL 中设置、清除和切换单个位?
How do you set, clear, and toggle a single bit in TCL?
在TCL scripting
中,如何以可靠的方式执行这些步骤?
- 将
x
中的位n
设置为'1'
- 清除
x
中的第 n 位到 '0'
- 在
x
中切换位 n
- 仅在
x
中提取位 n
- 将
x
中的位 n
更改为值 y
TCl
对 expr
的依赖使得任何类型的数学都有些混乱。
假设我们正在谈论切换编码为整数的值中的单个位,这很容易。这些都是进行位操作的所有经典方法(您也可以在许多其他语言中做一些非常相似的事情):
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
将数据块转换成0
和1
的字符串,然后在使用binary format
转换回来之前对其进行字符串操作,但其实更尴尬
在TCL scripting
中,如何以可靠的方式执行这些步骤?
- 将
x
中的位n
设置为'1'
- 清除
x
中的第 n 位到'0'
- 在
x
中切换位 - 仅在
x
中提取位n
- 将
x
中的位n
更改为值y
n
TCl
对 expr
的依赖使得任何类型的数学都有些混乱。
假设我们正在谈论切换编码为整数的值中的单个位,这很容易。这些都是进行位操作的所有经典方法(您也可以在许多其他语言中做一些非常相似的事情):
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
将数据块转换成0
和1
的字符串,然后在使用binary format
转换回来之前对其进行字符串操作,但其实更尴尬