Двоичные числа обычно являются строками и в действительности не используются в вычислениях.
Строки также менее сложны.
Шаблон двоичных чисел такой же, как и любой другой. Это повторяется, но быстрее.
Только небольшой набор необходим для генерации до 256 (0-255) двоичных чисел.
Шаблон может систематически расширяться для большего.
Стартовый шаблон 4, 0-3
bd = ["00","01","10","11"]
Функция объединения их в большие числа:
d2b n = head.drop n $ [ d++e++f++g | d <- bd, e <- bd, f <- bd, g <- bd]
d2b 125
"01111101"
Если не понятно, как расширяться, то
bd = ["000","001","010","011","100","101","110","111"]
Даст вам до 4096 двоичных цифр (0-4095). Все остальное остается прежним.
Если это не очевидно, функция db2
использует 4 пары двоичных чисел, поэтому 4 из набора. (2 ^ 8) - 1 или (2 ^ 12) - 1 - это сколько вы получаете.
Кстати, списком для понимания являются do
структуры с сахарным покрытием.
Создайте вышеуказанные шаблоны с
[ a++b | a <- ["0","1"], b <- ["0","1"] ]
[ "00", "01", "10", "11"]
и
[ a++b++c | a <- ["0","1"], b <- ["0","1"], c <- ["0","1"] ]
* 1 029 * [ "000", "001", "010", "011", "100", "101", "110", "111"]
В целом, один шаблон и одна функция могут служить цели
b2 = ["0","1"]
b4 = [ a++b++c++d | a <- b2, b <- b2, c <- b2, d <- b2]
b4
[ "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011 », "1100", "1101", "1110", "1111"] * 1 035 *
bb n = head.drop n $ [ a++b++c++d | a <- b4, b <- b4, c <- b4, d <- b4]
bb 32768
"1000000000000000"
bb 65535
"1111111111111111"
Для вычисления двоичного числа из десятичного числа непосредственно в Haskell с использованием вычитания
cvtd n (x:xs) | x>n = 0:(cvtd n xs)
| n>x = 1:(cvtd (n-x) xs)
| True = 1:[0|f<-xs]
Используйте любое количество битов, которое вы хотите, например, 10 бит.
cvtd 639 [2^e|e<-[9,8..0]]
[1,0,0,1,1,1,1,1,1,1]