SRFI 60 - Integers as bits

Various operations designed to work on integers as strings of bits efficiently.

See the [SRFI document][http://srfi.schemers.org/srfi-60/srfi-60.html] for more information.

Bitwise operations

logand logior logxor lognot logtest bitwise-and bitwise-ior bitwise-xor bitwise-not bitwise-if bitwise-merge any-bits-set?

Integer properties

logcount log2-binary-factors bit-count integer-length first-set-bit

Bit within word

logbit? bit-set? copy-bit

Field of bits

bit-field copy-bit-field ash arithmetic-shift rotate-bit-field

Bits as booleans

integer->list list->integer booleans->integer

logand

(logand n1 ...)

Returns the integer which is the bitwise-AND of the arguments.

Example: (number->string (logand #b1100 #b1010) 2) => "1000"

bitwise-and

Synonym for logand.

logior

(logior n1 ...)

Returns the integer which is the bitwise-OR of the arguments.

Example: (number->string (logior #b1100 #b1010) 2) => "1110"

bitwise-ior

Synonym for logior.

logxor

(logxor n1 ...)

Returns the integer which is the bitwise-XOR of the arguments.

Example: (number->string (logxor #b1100 #b1010) 2) => "110"

bitwise-xor

Synonym for logxor.

lognot

(lognot n)

Returns the integer which is the one’s-complement of the argument.

bitwise-not

Synonym for lognot.

bitwise-if

(bitwise-if mask n0 n1)

Returns an integer composed of some bits from n0 and some bits from n1. A bit of the result is taken from n0 if the corresponding bit of mask is 1, and from n1 otherwise.

bitwise-merge

Synonym for bitwise-if.

logtest

(logtest j k)

Equivalent to (not (zero? (logand j k))).

Example: (logtest #b0100 #b1011) => #f

any-bits-set?

Synonym for logtest.

logcount

(logcount n)

Returns the number of bits in n. If n is positive, the 1-bits in its binary representation are counted. If negative, the 0-bits in its two’s-complement binary representation are counted. If 0, then 0 is returned.

Example: (logcount #b10101010) => 4

bit-count

Synonym for logcount.

integer-length

(integer-length n)

Returns the number of bits necessary to represent n.

Example: (integer-length #b1011) => 4

log2-binary-factors

(log2-binary-factors n)

Returns the bit-index of the least-significant 1-bit in n. If n contains no 1-bits, -1 is returned.

Example: (log2-binary-factors 4) => 2

first-set-bit

Synonym for log2-binary-factors

logbit?

(logbit? index n)

Equivalent to (logtest (exact (expt 2 index)) n).

Example: (logbit? 1 #b1101) => #f

bit-set?

Synonym for logbit?.

copy-bit

(copy-bit index from bit)

Returns from, except in the indexth bit, which is 1 if bit is #t, and 0 if bit is #f.

Example: (number->string (copy-bit 2 #b1111 #f) 2) => "1011"

bit-field

(bit-field n start end)

Returns the integer composed of the start (inclusive) through end (exclusive) bits of n. The startth bit becomes the 0th bit in the result.

Example: (number->string (bit-field #b1101101010 0 4) 2) => "1010"

copy-bit-field

(copy-bit-field to from start end)

Returns to, except possibly in the start (inclusive) through end (exclusive) bits, which are the same as those of from. The 0th bit of from becomes the startth bit of the result.

Example: (number->string (copy-bit-field #b1101101010 0 0 4) 2) => "1101100000"

ash

(ash n count)

Equivalent to (exact (floor (* n (expt 2 count)))).

Example: (number->string (ash #b1010 -1) 2) => "101"

arithmetic-shift

Synonym for ash.

rotate-bit-field

(rotate-bit-field n count start end)

Returns n with the bit-field from start to end cyclically permuted by count bits towards high-order.

Example: (number->string (rotate-bit-field #b0100 3 0 4) 2) => "10"

reverse-bit-field

(reverse-bit-field n start end)

Returns n with the order of bits start to end reversed.

Example: (number->string (reverse-bit-field #b10100111 0 8) 2) => "11100101")

integer->list

(integer->list k)

(integer->list k len)

Returns a list of len booleans corresponding to each bit of the non-negative integer k. #t is coded for each 1; #f for each 0. len defaults to (integer-length k).

list->integer

(list->integer list)

Returns an integer formed from the booleans in list, which must consist only of booleans. A 1 bit is coded for each #t; a 0 bit for each #f. integer->list and list->integer are inverses up to equal?: thus, for any x, (equal x (integer->list (list->integer x))) => #t.

booleans->integer

(booleans->integer b1 ...)

Equivalent to (list->integer (list b1 ...)).