Function LOGAND, LOGANDC1, LOGANDC2, LOGEQV, LOGIOR, LOGNAND, LOGNOR, LOGNOT, LOGORC1, LOGORC2, LOGXOR

UP


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-2and
logandc2 integer-1と、integer-2の補数のand
logand -1 and
logeqv -1 同値(排他的nor
logior 0 包括的or
lognand integer-1integer-2andの補数
lognor integer-1integer-2orの補数
lognot 補数
logorc1 integer-1の補数と、integer-2or
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が通知されなければなりません。

参考

boole

備考

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

TOP, Github