R6RS:翻訳:Standard Libraries:11.4 Exact bitwise arithmetic

R6RS:翻訳:Standard Libraries:11.4 Exact bitwise arithmetic

11.4 正確なビット指向算術

本節では (rnrs arithmetic bitwise (6)) について述べる。正確なビット指向算術では正確な整数オブジェクト上の総称的な演算を提供する。本節では eiei1ei2 等を正確な整数オブジェクトでなければならない仮引き数の名前として使う。

[procedure] (bitwise-not ei)

2 の補数表現が ei の 2 の補数表現の 1 の補数である正確な整数オブジェクトを返す。

[procedure] (bitwise-and ei1 ...)

[procedure] (bitwise-ior ei1 ...)

[procedure] (bitwise-xor ei1 ...)

これらの手続きは引き数の 2 の補数表現のビット指向の「論理積」「論理和」「排他的論理和」である正確な整数オブジェクトを返す。引き数がひとつの場合にはその引き数を返す。引き数が渡されなかった場合にはこの操作の単位元として働く整数オブジェクト(-1 か 0)が返る。

[procedure] (bitwise-if ei1 ei2 ei3)

引き数の 2 の補数表現のビット指向の「if」である正確な整数オブジェクトを返す。すなわち、各ビットについて、それが 1 であれば ei2 の対応するビットが戻り値の対応するビットの値になり、 0 であった場合には ei3 の対応するビットが戻り値の対応するビットの値になる。これは次の計算の結果に等しい。

(bitwise-ior (bitwise-and ei1 ei2)
             (bitwise-and (bitwise-not ei1) ei3))

[procedure] (bitwise-bit-count ei)

ei が非負であれば、この手続きは ei の 2 の補数表現における 1 の個数を返す。そうでなければ次の計算の結果が返る。

(bitwise-not (bitwise-bit-count (bitwise-not ei)))

[procedure] (bitwise-length ei)

ei が正であればそれを表現するのに必要なビット数を返し、負であれば (bitwise-not ei) を表すのに必要なビット数を返す。これは次の計算結果に等しい正確な整数オブジェクトである。

(do ((result 0 (+ result 1))
     (bits (if (negative? ei)
               (bitwise-not ei)
               ei)
           (bitwise-arithmetic-shift bits -1)))
    ((zero? bits)
     result))

[procedure] (bitwise-first-bit-set ei)

ei の 2 の補数表現における最下位の 1 のビットの添え字を返す。 ei が 0 の場合には -1 が返る。

(bitwise-first-bit-set 0)                ⇒  -1
(bitwise-first-bit-set 1)                ⇒  0
(bitwise-first-bit-set -4)               ⇒  2

[procedure] (bitwise-bit-set? ei1 ei2)

ei2 は負数であってはならない。 bitwise-bit-set? 手続きは ei1 の 2 の補数表現の ei2 番目のビットが 1 であれば #t を返し、そうでなければ #f を返す。これは次の計算の結果に等しい。

(not (zero?
       (bitwise-and
         (bitwise-arithmetic-shift-left 1 ei2)
         ei1)))

[procedure] (bitwise-copy-bit ei1 ei2 ei3)

ei2 は負であってはならず、 ei3 は 0 か 1 でなければならない。 bitwise-copy-bit 手続きは ei1ei2 番目のビットを ei3ei2 番目のビットで置き換えた結果を返す。これは次の計算の結果に等しい。

(let* ((mask (bitwise-arithmetic-shift-left 1 ei2)))
  (bitwise-if mask
            (bitwise-arithmetic-shift-left ei3 ei2)
            ei1))

[procedure] (bitwise-bit-field ei1 ei2 ei3)

ei2ei3 は負数であってはならず、 ei2ei3 以下でなければならない。 bitwise-bit-field 手続きは ei1ei2 から(これを含む) ei3 まで(これを含まない)の位置のビットで表される数値を返す。これは次の計算の結果に等しい。

(let ((mask
       (bitwise-not
        (bitwise-arithmetic-shift-left -1 ei3))))
  (bitwise-arithmetic-shift-right
    (bitwise-and ei1 mask)
    ei2))

[procedure] (bitwise-copy-bit-field ei1 ei2 ei3 ei4)

ei2ei3 は負数であってはならず、 ei2ei3 以下でなければならない。 bitwise-copy-bit-field 手続きは ei1ei2 から(これを含む) ei3 (これを含まない)のの位置のビットを ei4 の対応するビットで置き換えた結果を返す。これは次の計算結果に等しい。

(let* ((to    ei1)
       (start ei2)
       (end   ei3)
       (from  ei4)
       (mask1
         (bitwise-arithmetic-shift-left -1 start))
       (mask2
         (bitwise-not
           (bitwise-arithmetic-shift-left -1 end)))
       (mask (bitwise-and mask1 mask2)))
  (bitwise-if mask
              (bitwise-arithmetic-shift-left from
                                             start)
              to))

[procedure] (bitwise-arithmetic-shift ei1 ei2)

次の計算の結果を返す。

(floor (* ei1 (expt 2 ei2)))

:

(bitwise-arithmetic-shift -6 -1) 
                ⇒ -3
(bitwise-arithmetic-shift -5 -1) 
                ⇒ -3
(bitwise-arithmetic-shift -4 -1) 
                ⇒ -2
(bitwise-arithmetic-shift -3 -1) 
                ⇒ -2
(bitwise-arithmetic-shift -2 -1) 
                ⇒ -1
(bitwise-arithmetic-shift -1 -1) 
                ⇒ -1

[procedure] (bitwise-arithmetic-shift-left ei1 ei2)

[procedure] (bitwise-arithmetic-shift-right ei1 ei2)

ei2 は非負でなければならない。 bitwise-arithmetic-shift-left は bitwise-arithmetic-shift と同じ結果を返し、 (bitwise-arithmetic-shift-right ei1 ei2) は (bitwise-arithmetic-shift ei1 (- ei2)) と同じ結果を返す。

[procedure] (bitwise-rotate-bit-field ei1 ei2 ei3 ei4)

ei2ei3ei4 は非負でなければならず、 ei2ei3 以下でなければならない。 bitwise-rotate-bit-field 手続きは ei1 中の ei2 から(これを含む) ei3 まで(これを含まない)のビットを ei4 ビットだけ上位方向に循環的に並べ換えた結果を返す。これは次の計算の結果に等しい。

(let* ((n     ei1)
       (start ei2)
       (end   ei3)
       (count ei4)
       (width (- end start)))
  (if (positive? width)
      (let* ((count (mod count width))
             (field0
               (bitwise-bit-field n start end))
             (field1 (bitwise-arithmetic-shift-left
                       field0 count))
             (field2 (bitwise-arithmetic-shift-right
                       field0
                       (- width count)))
             (field (bitwise-ior field1 field2)))
        (bitwise-copy-bit-field n start end field))
      n))

[procedure] (bitwise-reverse-bit-field ei1 ei2 ei3)

ei2ei3 は非負でなければならず、 ei2ei3 以下でなければならない。 bitwise-reverse-bit-field 手続きは ei1 中の ei2 から(これを含む) ei3 まで(これを含まない)の位置のビットの順序を逆転させて得られる結果を返す。

(bitwise-reverse-bit-field #b1010010 1 4)   
                ⇒  88 ; #b1011000

Last modified : 2008/05/08 16:06:52 UTC