Шаг 124.
Основы языка Haskell. Абстрактные типы данных (АТД). Ассоциативные списки на базе списка пар. Работа с битами в языке Haskell

    На этом шаге мы рассмотрим работу с битами.

    Для работы с битами используется модуль 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
Файл с примерами можно взять здесь.

    На следующем шаге мы рассмотрим понятие "ассоциативный список".




Предыдущий шаг Содержание Следующий шаг