Monday, October 07, 2013
Print bit representation of a signed integer in Common Lisp
So, how do you print the bits of a signed integer in Common Lisp? Easy enough:
(defun print-bits (n)
(let ((*print-base* 2))
(print n)
(values)))
> (print-bits 10)
1010
Or
(defun print-bits (n)
(format t "~B" n)
(values))
> (print-bits 10)
1010
But what happens if you try to print a negative number?
> (print-bits -10)
-1010
Not exactly what we were looking for -- we were looking for the bit representation of this number in two's complement form, which is how logical operations treat integers in Common Lisp. So how do we print the bits in two's complement form? The trick is to use ldb
. ldb
returns a non-negative integer with the exact bits that were contained in the given integer, be it positive or negative.
(defun print-bits (n size)
(format t "~B" (ldb (byte size 0) n))
(values))
> (print-bits -10 8)
11110110
> (print-bits -1 16)
1111111111111111
where size
is the number of bits that we want to print. Note that you need to be careful about size since this will truncate the printed bits if integer can't be represented in size
bits.
Bonus: How do you pad this binary representation to the given size
with zeroes on the left for positive numbers? (negative numbers are already padded)
(defun print-bits (n size)
(format t (format nil "~~~D,'0B" size) (ldb (byte size 0) n))
(values))
> (print-bits 1 4)
0001
> (print-bits 1 8)
00000001
> (print-bits -1 16)
1111111111111111
Labels: cl, lisp, programming
Subscribe to Posts [Atom]