Function BOOLE

UP


Function BOOLE

Function BOOLE

構文

boole op integer-1 integer-2 => result-integer

引数と戻り値

op - ビット毎の論理演算指定子
integer-1 - 整数
integer-2 - 整数
result-integer - 整数

定義

booleは、integer-1integer-2を2の補数表記のバイナリとして扱い、 ビット毎の論理演算を行います。

実施する処理と返却値はopによって決まります。

booleは次の表に示されるopによって 返却値が指定されます。

op 結果
boole-1 integer-1
boole-2 integer-2
boole-andc1 integer-1の補数と、integer-2and
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-2or
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を通知するべきです。

参考

logand

備考

一般的に下記の等式が成り立ちます。

(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)

TOP, Github