Поддерживает ли TCL встроенные функции типа get_bits и set_bits?

#tcl #bit

#tcl #бит

Вопрос:

get_bits вернет определенные биты значения, а set_bits установит определенные биты значения в указанное значение. Содержит ли TCL такие встроенные функции или они должны быть написаны пользователем?

Команда двоичного сканирования действительно близка к функции get_bits, но это не одно и то же.

Комментарии:

1. Каковы сигнатуры этих функций? Какие возвращаемые значения?

Ответ №1:

Нет конкретной функции для получения или установки определенного бита. Мы можем их сделать.

 proc get_bit {value bit} {
    expr {($value amp; (1 << $bit)) != 0}
}

proc set_bit {varName bit {value 1}} {
    upvar 1 $varName var
    if {$value} {
        set var [expr {$var | (1 << $bit)}]
    } else {
        set var [expr {$var amp; ~(1 << $bit)}]
    }
}
 

Они будут работать с целочисленными значениями любой ширины; вы не ограничены 32 битами или 64 битами.

 # Lots of bits!
set x 123456789012345678901234567890

# Fetch a particular bit
puts [get_bit $x 17]
# Set a bit to 1
set_bit x 78
puts "x = $x"
# Set a bit to 0
set_bit x 75 0
puts "x = $x"
 

Комментарии:

1. как насчет get_bits и set_bits, т.е. Нескольких битов, а не только одного бита

2. @quantum231 Вы можете написать свой собственный на основе предоставленного однобитового кода?