Novices sometimes ask how to get a convert an integer to a list of bits, often for the purpose of iterating over the bits somehow. Common Lisp has a rich set of functions for directly accessing the bits of an integer, so constructing an intermediate list of bits is rarely necessary.
Here are a few examples of accessing the bits of an integer.
With byte to construct a byte specifier and ldb to extract a field from the integer:
(defun list-of-bits (integer)
(loop for position below (integer-length integer)
collect (ldb (byte 1 position) integer)))
Update
Unfortunately, all these examples are buggy - they collect bits in the wrong order. I used loop/collect to avoid having to reverse the results, but didn’t think it through properly. Here are some updated definitions with dotimes that give the results in the intended order:
Novices sometimes ask how to get a convert an integer to a list of bits, often for the purpose of iterating over the bits somehow. Common Lisp has a rich set of functions for directly accessing the bits of an integer, so constructing an intermediate list of bits is rarely necessary.
Here are a few examples of accessing the bits of an integer.
With integer-length and logbitp to test the bit at a particular index:
With ash to shift the integer to the right and logand to test the least-significant bit:
With ash to shift a one-bit mask to the left and logtest to test the mask bit against the integer:
With byte to construct a byte specifier and ldb to extract a field from the integer:
Update
Unfortunately, all these examples are buggy - they collect bits in the wrong order. I used loop/collect to avoid having to reverse the results, but didn’t think it through properly. Here are some updated definitions with dotimes that give the results in the intended order:
(source: https://lisptips.com/post/44261316742/how-do-i-convert-an-integer-to-a-list-of-bits)