The bit is a basic unit of information in information theory, computing. This package includes bit twiddling hacks by Sean Eron Anderson and many others.\ 📦 Package, 📘 Wiki.
count : Basics.Int -> Basics.Int
Count bits set. 📘
-- x: an Int
count 7 == 3 -- 111 ⇒ 3
count 12 == 2 -- 1100 ⇒ 2
count 63 == 6 -- 111111 ⇒ 6
get : Basics.Int -> Basics.Int -> Basics.Int
Get a bit. 📘
-- x: an Int
-- i: bit index
get 6 0 == 0 -- 110,0 ⇒ 0
get 6 1 == 1 -- 110,1 ⇒ 1
get 6 2 == 1 -- 110,2 ⇒ 1
getAs : Basics.Int -> Basics.Int -> Basics.Int
Get bits as per mask. 📘
-- x: an Int
-- m: bit mask
getAs 6 4 == 4 -- 110,100 ⇒ 100
getAs 6 7 == 6 -- 110,111 ⇒ 110
getAs 6 5 == 4 -- 110,101 ⇒ 100
interleave : Basics.Int -> Basics.Int -> Basics.Int
Interleave bits of two Int16s. 📘
-- x: first Int16
-- y: second Int16
interleave 0x0000 0xFFFF == 1431655765 -- 0x55555555
interleave 0x1234 0x1234 == 51121968 -- 0x030C0F30
interleave 0x1234 0x4321 == 302845473 -- 0x120D0E21
merge : Basics.Int -> Basics.Int -> Basics.Int -> Basics.Int
Merge bits as per mask. 📘
-- x: first Int
-- y: second Int
-- m: bit mask (0 ⇒ from x)
merge 0x12 0x24 0x0F == 20 -- 0x14
merge 0x1234 0xABCD 0x0F0F == 6973 -- 0x1B3D
merge 0xAAAA 0xBBBB 0x3333 == 48059 -- 0xBBBB
parity : Basics.Int -> Basics.Int -> Basics.Int
Get n-bit parity. 📘
-- x: an Int
-- n: number of bits (1)
parity 7 1 == 1 -- 1,1,1 ⇒ 1
parity 5 1 == 0 -- 1,0,1 ⇒ 0
parity 8 2 == 2 -- 10,00 ⇒ 10
parity 63 4 == 12 -- 11,1111 ⇒ 1100
reverse : Basics.Int -> Basics.Int
Reverse all bits. 📘
-- x: an Int
reverse 0xFFFF0000 == 65535 -- 0x0000FFFF
reverse 0x00AABBCC == 870143232 -- 0x33DD5500
reverse 0x1234 == 742916096 -- 0x2C480000
rotate : Basics.Int -> Basics.Int -> Basics.Int
Rotate bits. 📘
-- x: an Int
-- n: rotate amount (+ve: left, -ve: right)
rotate 0x11112222 4 == 286401057 -- 0x11122221
rotate 0x11112222 -4 == 554766882 -- 0x21111222
scan : Basics.Int -> Basics.Int
Get index of first set bit from LSB. 📘
-- x: an Int
scan 7 == 0 -- 111 ⇒ 0
scan 12 == 2 -- 1100 ⇒ 2
scan 64 == 6 -- 1000000 ⇒ 6
scanReverse : Basics.Int -> Basics.Int
Gets index of first set bit from MSB. 📘
-- x: an Int
scanReverse 13 == 3 -- 1101 ⇒ 3
scanReverse 5 == 2 -- 101 ⇒ 2
scanReverse 1 == 0 -- 1 ⇒ 0
set : Basics.Int -> Basics.Int -> Basics.Int -> Basics.Int
Set a bit. 📘
-- x: an Int
-- i: bit index
-- f: bit value (1)
set 6 0 1 == 7 -- 110,0,1 ⇒ 111
set 6 2 1 == 6 -- 110,2,1 ⇒ 110
set 6 2 0 == 2 -- 110,2,0 ⇒ 010
setAs : Basics.Int -> Basics.Int -> Basics.Int -> Basics.Int
Set bits as per mask. 📘
-- x: an Int
-- m: bit mask
-- f: bit value (1)
setAs 8 2 1 == 10 -- 0x8 set 0x2 ⇒ 0xA
setAs 15 3 0 == 12 -- 0xF clear 0x3 ⇒ 0xC
setAs 0x1234 0x430 1 == 5684 -- 0x1234 set 0x430 ⇒ 0x1634
signExtend : Basics.Int -> Basics.Int -> Basics.Int
Sign extend variable bit-width integer. 📘
-- x: variable bit-width Int
-- w: bit width (32)
signExtend 15 4 == -1 -- 1111 ⇒ -1
signExtend 3 3 == 3 -- 011 ⇒ 3
signExtend 4 3 == -4 -- 100 ⇒ -4
swap : Basics.Int -> Basics.Int -> Basics.Int -> Basics.Int -> Basics.Int
Swap bit sequences. 📘
-- x: an Int
-- i: first bit index
-- j: second bit index
-- n: bit width (1)
swap 6 1 0 1 == 5 -- 110 ⇒ 101
swap 0x1234 8 4 4 == 4900 -- 0x1234 ⇒ 0x1324
swap 0x4AAB 8 0 8 == 43850 -- 0x4AAB ⇒ 0xAB4A
toggle : Basics.Int -> Basics.Int -> Basics.Int
Toggle a bit. 📘
-- x: an Int
-- i: bit index
toggle 6 0 == 7 -- 110,0 ⇒ 111
toggle 6 1 == 4 -- 110,1 ⇒ 100
toggle 6 2 == 2 -- 110,2 ⇒ 010
toggleAs : Basics.Int -> Basics.Int -> Basics.Int
Toggle bits as per mask. 📘
-- x: an Int
-- m: bit mask
toggleAs 6 1 == 7 -- 110,000 ⇒ 111
toggleAs 6 7 == 1 -- 110,111 ⇒ 001
toggleAs 6 3 == 5 -- 110,011 ⇒ 101