Инвертировать значения двух старших битов каждой тетрады - Lisp
Формулировка задачи:
Задание
Прочитать беззнаковое целое число из стандартного потока ввода и в каждом байте числа инвертировать значения двух старших битов каждой тетрады, если младший бит тетрады единичный. Результат вывести в стандартный поток вывода.
Примеры преобразования:
65535 (11111111 11111111) ==> 13107 (00110011 00110011)
333444 (00000101 00010110 10000100) ==> 644740 (00001001 11010110 10000100)
Решение задачи: «Инвертировать значения двух старших битов каждой тетрады»
textual
Листинг программы
- (defun task (n)
- (let ((bn (fix2bit n))
- (m1 &H01)
- (m2 &H0C))
- (iter (repeat 8)
- (unless (eq &H0 (logAnd m1 bn)) (setq bn (logXor bn m2)))
- (setq m1 (leftShift m1 4) m2 (leftShift m2 4))) (bit2fix bn)))
- ==> TASK
- (task 65535)
- ==> 13107
- (task 333444)
- ==> 644740
Объяснение кода листинга программы
В коде определена функция task
, которая принимает в качестве аргумента целое число n
. Внутри функции используются следующие переменные:
bn
— переменная, которая изначально содержит значениеn
с двумя старшими битами, установленными в ноль. В процессе выполнения функции значение переменнойbn
будет меняться.m1
иm2
— две переменные, которые используются для хранения результатов промежуточных вычислений. Изначально обе переменные равны нулю. Внутри функции используется циклiter
, который повторяется 8 раз. На каждой итерации выполняются следующие действия:- Проверяется равенство двух старших битов значения переменной
bn
нулю. Если это так, то выполняется операция побитового исключающего OR надbn
иm2
, после чего значение переменнойbn
обновляется. - Значения переменных
m1
иm2
сдвигаются влево на 4 бита, а затем выполняется операция побитового исключающего OR надm1
иm2
. Результат этой операции присваивается переменнойm1
. После завершения цикла значение переменнойbn
преобразуется из двоичного в десятичное с помощью функцииbit2fix
. В конце кода вызывается функцияtask
с аргументом 65535, что приводит к выводу значения 13107. Затем вызывается функцияtask
с аргументом 333444, что приводит к выводу значения 644740.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д