基本的なビット演算をする - lisp-cookbook-ja/common-lisp GitHub Wiki

  • log*系関数

整数値を2進数として扱い、ビット演算をする関数にはlogand などがあります。

(logand #b0110 #b1101) ;=>   4 = #b0100
(logior #b0110 #b1101) ;=>  15 = #b1111
(logxor #b0110 #b1101) ;=>  11 = #b1011

log*系の関数には次のようなものがあります

logand AND演算
logandc1 (logandc1 n1 n2) == (logand (lognot n1) n2)
logandc2 (logandc2 n1 n2) == (logand n1 (lognot n2))
logeqv Exclusive NOR演算
logior OR演算
lognand NAND演算
lognor NOR演算
lognot NOT演算
logorc1 (logorc1 n1 n2) == (logior (lognot n1) n2)
logorc2 (logorc2 n1 n2) == (logior n1 (lognot n2))
logxor XOR演算

boole 関数

log*系関数によってできるビット演算を、boole関数から呼び出すことができます。 第二引数に演算を指定し、引数となる2つの整数を用いた論理演算を行います。

(boole boole-and #b0110 #b1101) ;=>   4 = #b0100
(boole boole-ior #b0110 #b1101) ;=>  15 = #b1111
(boole boole-xor #b0110 #b1101) ;=>  11 = #b1011

演算には次のような種類があります

演算 結果
boole-1 引数1を返します
boole-2 引数2を返します
boole-and AND演算
boole-andc1 logandc1 と同じ
boole-andc2 logandc2 と同じ
boole-c1 引数1の補数を返します
boole-c2 引数2の補数を返します
boole-clr 常に0を返します(すべてのビットが0である)
boole-eqv Exclusive NOR演算
boole-ior OR演算
boole-nand NAND演算
boole-nor NOR演算
boole-orc1 logorc1 と同じ
boole-orc2 logorc2 と同じ
boole-set 常に-1を返します(すべてのビットが1である)
boole-xor XOR演算