本節では (rnrs arithmetic bitwise (6)) について述べる。正確なビット指向算術では正確な整数オブジェクト上の総称的な演算を提供する。本節では ei、 ei1、 ei2 等を正確な整数オブジェクトでなければならない仮引き数の名前として使う。
2 の補数表現が ei の 2 の補数表現の 1 の補数である正確な整数オブジェクトを返す。
これらの手続きは引き数の 2 の補数表現のビット指向の「論理積」「論理和」「排他的論理和」である正確な整数オブジェクトを返す。引き数がひとつの場合にはその引き数を返す。引き数が渡されなかった場合にはこの操作の単位元として働く整数オブジェクト(-1 か 0)が返る。
引き数の 2 の補数表現のビット指向の「if」である正確な整数オブジェクトを返す。すなわち、各ビットについて、それが 1 であれば ei2 の対応するビットが戻り値の対応するビットの値になり、 0 であった場合には ei3 の対応するビットが戻り値の対応するビットの値になる。これは次の計算の結果に等しい。
(bitwise-ior (bitwise-and ei1 ei2) (bitwise-and (bitwise-not ei1) ei3))
ei が非負であれば、この手続きは ei の 2 の補数表現における 1 の個数を返す。そうでなければ次の計算の結果が返る。
(bitwise-not (bitwise-bit-count (bitwise-not 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))
ei の 2 の補数表現における最下位の 1 のビットの添え字を返す。 ei が 0 の場合には -1 が返る。
(bitwise-first-bit-set 0) ⇒ -1 (bitwise-first-bit-set 1) ⇒ 0 (bitwise-first-bit-set -4) ⇒ 2
ei2 は負数であってはならない。 bitwise-bit-set? 手続きは ei1 の 2 の補数表現の ei2 番目のビットが 1 であれば #t を返し、そうでなければ #f を返す。これは次の計算の結果に等しい。
(not (zero? (bitwise-and (bitwise-arithmetic-shift-left 1 ei2) ei1)))
ei2 は負であってはならず、 ei3 は 0 か 1 でなければならない。 bitwise-copy-bit 手続きは ei1 の ei2 番目のビットを ei3 の ei2 番目のビットで置き換えた結果を返す。これは次の計算の結果に等しい。
(let* ((mask (bitwise-arithmetic-shift-left 1 ei2))) (bitwise-if mask (bitwise-arithmetic-shift-left ei3 ei2) ei1))
ei2 と ei3 は負数であってはならず、 ei2 は ei3 以下でなければならない。 bitwise-bit-field 手続きは ei1 の ei2 から(これを含む) ei3 まで(これを含まない)の位置のビットで表される数値を返す。これは次の計算の結果に等しい。
(let ((mask (bitwise-not (bitwise-arithmetic-shift-left -1 ei3)))) (bitwise-arithmetic-shift-right (bitwise-and ei1 mask) ei2))
ei2 と ei3 は負数であってはならず、 ei2 は ei3 以下でなければならない。 bitwise-copy-bit-field 手続きは ei1 の ei2 から(これを含む) 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))
次の計算の結果を返す。
(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
ei2 は非負でなければならない。 bitwise-arithmetic-shift-left は bitwise-arithmetic-shift と同じ結果を返し、 (bitwise-arithmetic-shift-right ei1 ei2) は (bitwise-arithmetic-shift ei1 (- ei2)) と同じ結果を返す。
ei2、 ei3、 ei4 は非負でなければならず、 ei2 は ei3 以下でなければならない。 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))
ei2、 ei3 は非負でなければならず、 ei2 は ei3 以下でなければならない。 bitwise-reverse-bit-field 手続きは ei1 中の ei2 から(これを含む) ei3 まで(これを含まない)の位置のビットの順序を逆転させて得られる結果を返す。
(bitwise-reverse-bit-field #b1010010 1 4) ⇒ 88 ; #b1011000