整数値のビット長を求める - lisp-cookbook-ja/common-lisp GitHub Wiki

整数値について、2進数(2の補数)で表現した場合に最低でも必要なビット長を integer-length 関数で求めることができます。

(integer-length 128) ;=> 8
(integer-length 127) ;=> 7
(integer-length #b0110) => 3
(integer-length -5) ;=> 3
(integer-length -8) ;=> 3
(integer-length -9) ;=> 4

注意点

Common Lisp の整数値は、無限の長さを持つことができます。 そのため、引数の整数値を表すために必要な最短のビット長さを求めることになります。 負の整数の場合、値は2の補数として扱われます。

負の整数の場合の戻り値は、負の数を示すための最上位ビット分を除いた値となっています。 実際の値を表すために最低でも必要なビットの長さは、最上位ビット分の1を加える必要があります。

(例) -5 は 8bit の2の補数では 1111 1011 と表現できます。 integer-length は 011 のみを考え 3 と返します。 負の数であることを明示する最上位ビットが1ケタ分必要です。

(例) -8 は 8bit の2の補数では 1111 1000 と表現できます。 integer-length は 000 のみを考え 3 と返します。