На этом шаге мы рассмотрим работу с битами.
Для работы с битами используется модуль Bits.
Рассмотрим демонстрационный пример, иллюстрирующий работу с битами.
-- Демонстрация работы с модулем Bits, предназначенного для -- применения битовых операций для нумералов. -- -- Биты нумеруются с нулевого бита, причём нулевой бит -- является младшим. -- Метод .&. определяет побитовую операцию "И". -- Метод .|. определяет побитовую операцию "ИЛИ". -- Метод xor определяет побитовую операцию "Исключающее ИЛИ". -- Метод complement возвращает значение< в котором все биты -- обращены (0 в 1 и наоборот), нежели во входном аргументе. -- Метод shift сдвигает аргумент влево на заданное количество -- позиций. Правый сдвиг для чисел со знаком достигается при -- помощи этого же метода, применённого к числу с обратным -- знаком. -- Метод rotate циклически сдвигает влево свой аргумент на -- заданное количество позиций. Правый циклический сдвиг осу- -- ществляется так же, как и для метода shift. Для неограни- -- ченных типов (например, Integer) циклический сдвиг эквива- -- лентен простому сдвигу. -- Метод bit возвращает значение с установленным i-м битом -- (i задаётся в качестве аргумента). -- Два метода setBit и clearBit устанавливают и очищают за- -- данный бит в заданном числе соответственно. -- Метод complementBit обращает заданный бит в заданном числе. -- -- setBit x i = x .|. bit i -- clearBit x i = x .&. complement (bit i) -- complementBit x i = x `xor` bit i -- -- Метод testBit возвращает значение True, если заданный бит -- в заданном числе установлен (равен 1). -- Метод bitSize возвращает количество битов, которое занимает -- входное значение. Само значение не используется в методе. -- Для значений неопределённого размера (например, тип Integer) -- метод возвращает неопределённое значение. -- Метод isSigned возвращает True, если входной аргумент явля- -- ется числом со знаком, и False в противном случае. -- Группа методов shiftL, shiftR, rotateL, rotateR осуществляют -- сдвиг или циклический сдвиг влево или вправо соответственно -- на заданное количество позиций. Аргументы всех этих функций -- должны быть неотрицательными -- **************************** import Bits import Int ----------------------------------------------------- test1 = (intToInt8 6) .&. (intToInt8 4) == 4 && (intToInt8 15) .&. (intToInt8 8) == 8 && (intToInt8 1523423) .&. (intToInt8 8) == 8 ---------------------------------------------- && (intToInt8 6) `shift` 3 == 48 && (intToInt8 1) `shift` 4 == 16 && (intToInt8 1) `shiftR` 3 == 0 && (intToInt8 1) `shiftL` 3 == 8 && (intToInt8 1) `shiftL` 30000 == 0 && (intToInt8 1) `shiftL` 7 == (-128) --------------------------------------------------------- x = 10 test11 = (intToInt8 (toInt x)) `shiftR` 2 test12 = (intToInt8 15) .|. (intToInt8 8) test13 = testBit (intToInt8 12) 3 == True test14 = rotate (intToInt8 12) (toInt 2) ---------------------------------------- -- test2 = bit (toInt 2) -- == 4 -- test3 = (int32ToInt8 . bit) 2 == 4 -- test4 = (int32ToInt8 . bit) 8 == 0 -- test5 = (int32ToInt8 . bit) 16 == 0 -- test6 = (int32ToInt8 . bit) 4 == 16 -- test7 = (int32ToInt8 . bit) 4 == 16 -------------------------------------------- test8 = testBit (intToInt32 23) 1 == True test9 = testBit (intToInt32 5) 0 == True test10 = testBit (intToInt32 5) 1 == False test11' = testBit (intToInt32 5) 2 == True test12' = testBit (intToInt32 5) 1 == False
На следующем шаге мы рассмотрим понятие "ассоциативный список".