Инвертировать значения двух старших битов каждой тетрады - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д