Как объединить битовые поля в Tcl для генерации одного 64-битного значения? - PullRequest
0 голосов
/ 05 августа 2020

Мы передаем в функцию отдельные параметры, которые должны быть объединены в 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 to value6 были переданы в pro c в Tcl, как можно go собрать их в 64-битное значение, а затем сохранить верхние и нижние 32 бита этого 64-битного значения в отдельных переменных?

1 Ответ

1 голос
/ 05 августа 2020

Если все значения находятся в диапазоне поля, в которое они должны быть вставлены, вы можете просто сдвинуть их и объединить ИЛИ вместе.

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

Если они не обязательно находятся в диапазоне, перед сдвигом необходимо замаскировать биты, выходящие за пределы допустимого диапазона.

Обратите внимание, что вам нужно no специальное действие для перехода через границы байта или слова. Если вам нужно битовое поле шириной в тысячи мест, вы можете его получить. (Целые числа Tcl обычно «настолько широки, насколько они должны быть» и не имеют технической верхней границы, пока вы не столкнетесь с проблемами управления памятью.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...