% Function LOGAND, LOGANDC1, LOGANDC2, LOGEQV, LOGIOR, LOGNAND, LOGNOR, LOGNOT, LOGORC1, LOGORC2, LOGXOR
Function LOGAND
, LOGANDC1
, LOGANDC2
, LOGEQV
,
LOGIOR
, LOGNAND
, LOGNOR
, LOGNOT
,
LOGORC1
, LOGORC2
, LOGXOR
logand
&rest
integers => result-integer
logandc1
integer-1 integer-2 => result-integer
logandc2
integer-1 integer-2 => result-integer
logeqv
&rest
integers => result-integer
logior
&rest
integers => result-integer
lognand
integer-1 integer-2 => result-integer
lognor
integer-1 integer-2 => result-integer
lognot
integer => result-integer
logorc1
integer-1 integer-2 => result-integer
logorc2
integer-1 integer-2 => result-integer
logxor
&rest
integers => result-integer
integers - 整数
integer - 整数
integer-1 - 整数
integer-2 - 整数
result-integer - 整数
関数logandc1
, logandc2
, logand
, logeqv
,
logior
, lognand
, lognor
, lognot
,
logorc1
, logorc2
, logxor
は、
引数をバイナリであるかのように扱い、
ビット毎の論理演算処理を行います。
次の表は、各関数の意味を示しています。 「同一」となっている所は、 引数が指定されなかったときにその関数が生成する値を示しています。
関数 | 同一 | 演算処理 |
---|---|---|
logandc1 |
— | integer-1の補数と、integer-2のand |
logandc2 |
— | integer-1と、integer-2の補数のand |
logand |
-1 |
and |
logeqv |
-1 |
同値(排他的nor ) |
logior |
0 |
包括的or |
lognand |
— | integer-1とinteger-2のand の補数 |
lognor |
— | integer-1とinteger-2のor の補数 |
lognot |
— | 補数 |
logorc1 |
— | integer-1の補数と、integer-2のor |
logorc2 |
— | integer-1と、integer-2の補数のor |
logxor |
0 |
排他的or |
Figure 12-18. 整数のビット毎の論理演算
負のintegersは、2の補数表記として扱われます。
(logior 1 2 4 8) => 15
(logxor 1 3 7 15) => 10
(logeqv) => -1
(logand 16 31) => 16
(lognot 0) => -1
(lognot 1) => -2
(lognot -1) => 0
(lognot (1+ (lognot 1000))) => 999
;;; 下記の例のmはマスクです。
;;; マスクの各ビットが1のとき、対応するxとyのビットは交換されます。
;;; マスクの各ビットが0のとき、対応するxとyのビットは変更されません。
(flet ((show (m x y)
(format t "~%m = #o~6,'0O~%x = #o~6,'0O~%y = #o~6,'0O~%"
m x y)))
(let ((m #o007750)
(x #o452576)
(y #o317407))
(show m x y)
(let ((z (logand (logxor x y) m)))
(setq x (logxor z x))
(setq y (logxor z y))
(show m x y))))
>> m = #o007750
>> x = #o452576
>> y = #o317407
>>
>> m = #o007750
>> x = #o457426
>> y = #o312557
=> NIL
なし。
なし。
各引数が整数ではなかったとき、
型type-error
が通知されなければなりません。
(logbitp k -1)
は、kが全ての値でtrueになります。
下記の関数は結合的ではありませんので、 それらは複数の引数を取るのではなく 正確に2つの引数を取ります。
(lognand n1 n2) == (lognot (logand n1 n2))
(lognor n1 n2) == (lognot (logior n1 n2))
(logandc1 n1 n2) == (logand (lognot n1) n2)
(logandc2 n1 n2) == (logand n1 (lognot n2))
(logiorc1 n1 n2) == (logior (lognot n1) n2)
(logiorc2 n1 n2) == (logior n1 (lognot n2))
(logbitp j (lognot x)) == (not (logbitp j x))