% Function BOOLE
Function BOOLE
boole
op integer-1 integer-2 => result-integer
op - ビット毎の論理演算指定子
integer-1 - 整数
integer-2 - 整数
result-integer - 整数
boole
は、integer-1とinteger-2を2の補数表記のバイナリとして扱い、
ビット毎の論理演算を行います。
実施する処理と返却値はopによって決まります。
boole
は次の表に示されるopによって
返却値が指定されます。
op | 結果 |
---|---|
boole-1 |
integer-1 |
boole-2 |
integer-2 |
boole-andc1 |
integer-1の補数と、integer-2のand |
boole-andc2 |
integer-1と、integer-2の補数のand |
boole-and |
and |
boole-c1 |
integer-1の補数 |
boole-c2 |
integer-2の補数 |
boole-clr |
常に0 (全ビットがゼロ) |
boole-eqv |
同値(排他的nor ) |
boole-ior |
包括的or |
boole-nand |
not-and |
boole-nor |
not-or |
boole-orc1 |
integer-1の補数と、integer-2のor |
boole-orc2 |
integer-1と、integer-2の補数のor |
boole-set |
常に-1 (全ビットが1 ) |
boole-xor |
排他的or |
Figure 12-17. ビット毎の論理演算
(boole boole-ior 1 16) => 17
(boole boole-and -2 5) => 4
(boole boole-eqv 17 15) => -31
;;; これらの例はBOOLEの実行結果と指定できるOPの値、
;;; それぞれのあるビットの組み合わせを示したものです。
(progn
(format t "~&Results of (BOOLE <op> #b0011 #b0101) ...~
~%---Op-------Decimal-----Binary----Bits---~%")
(dolist (symbol '(boole-1 boole-2 boole-and boole-andc1
boole-andc2 boole-c1 boole-c2 boole-clr
boole-eqv boole-ior boole-nand boole-nor
boole-orc1 boole-orc2 boole-set boole-xor))
(let ((result (boole (symbol-value symbol) #b0011 #b0101)))
(format t "~& ~A~13T~3,' D~23T~:*~5,' B~31T ...~4,'0B~%"
symbol result (logand result #b1111)))))
>> Results of (BOOLE <op> #b0011 #b0101) ...
>> ---Op-------Decimal-----Binary----Bits---
>> BOOLE-1 3 11 ...0011
>> BOOLE-2 5 101 ...0101
>> BOOLE-AND 1 1 ...0001
>> BOOLE-ANDC1 4 100 ...0100
>> BOOLE-ANDC2 2 10 ...0010
>> BOOLE-C1 -4 -100 ...1100
>> BOOLE-C2 -6 -110 ...1010
>> BOOLE-CLR 0 0 ...0000
>> BOOLE-EQV -7 -111 ...1001
>> BOOLE-IOR 7 111 ...0111
>> BOOLE-NAND -2 -10 ...1110
>> BOOLE-NOR -8 -1000 ...1000
>> BOOLE-ORC1 -3 -11 ...1101
>> BOOLE-ORC2 -5 -101 ...1011
>> BOOLE-SET -1 -1 ...1111
>> BOOLE-XOR 6 110 ...0110
=> NIL
なし。
もし最初の引数がビット毎の論理演算指定子ではないか、
続く引数が整数ではなかったとき、
型type-error
を通知するべきです。
一般的に下記の等式が成り立ちます。
(boole boole-and x y) == (logand x y)
ビット毎の論理演算指定子ではなく、 数値であるインデックス値を使いたいプログラマーは、 次に示すようなテクニックを用いて同じ効果を得ることができます。
;; この「テーブル」の値の順番は、
;; (logand (boole (elt boole-n-vector n) #b0101 #b0011) #b1111) => n
(defconstant boole-n-vector
(vector boole-clr boole-and boole-andc1 boole-2
boole-andc2 boole-1 boole-xor boole-ior
boole-nor boole-eqv boole-c1 boole-orc1
boole-c2 boole-orc2 boole-nand boole-set))
=> BOOLE-N-VECTOR
(proclaim '(inline boole-n))
=> 実装依存
(defun boole-n (n integer &rest more-integers)
(apply #'boole (elt boole-n-vector n) integer more-integers))
=> BOOLE-N
(boole-n #b0111 5 3) => 7
(boole-n #b0001 5 3) => 1
(boole-n #b1101 5 3) => -3
(loop for n from #b0000 to #b1111 collect (boole-n n 5 3))
=> (0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1)