For Gauche 0.9.6


Next: , Previous: , Up: ライブラリモジュール - SRFI   [Contents][Index]

11.32 srfi-151 - ビット演算

Module: srfi-151

このモジュールは包括的なビット演算手続きを提供します。 ほぼsrfi-60のスーパーセットですが、いくつかの手続きは一貫性と互換性のために 名前が変わりました(srfi-60については整数に対するビット操作参照)。 srfi-60も以前のコードとの互換性のため残されますが、新たに書くコードは このモジュールを使うことを推奨します。

以下の手続きはGauche組み込みになっています。 説明は基本的なビット演算を参照してください。

integer-length    copy-bit          bit-field

基本演算

Function: bitwise-not n

[SRFI-151] {srfi-151} nの各ビットを反転したものを返します。 組み込みのlognotと同じです。(基本的なビット演算参照)。

Function: bitwise-and n …
Function: bitwise-ior n …
Function: bitwise-xor n …
Function: bitwise-eqv n …

[SRFI-151] {srfi-151} 引数が与えられない場合、これらはそれぞれ-100-1を 返します。引数がひとつの場合はそれをそのまま返します。 引数が二つの場合は、それらのビット毎のand、ior、xor、及びeqv (xorの論理反転) を 取ったものを返します。3引数以上は、2引数の計算から導かれます。

(bitwise-xor a b c)
 ≡ (bitwise-xor a (bitwise-xor b c))
 ≡ (bitwise-xor (bitwise-xor a b) c)

この定義では、3引数以上のbitwise-eqvは 「すべての引数の該当ビットが同じである時に1」とはならないことに注意してください。

最初の3つの手続きはそれぞれ組み込みの logandlogiorlogxorと同じです (基本的なビット演算参照)。

Function: bitwise-nand n0 n1
Function: bitwise-nor n0 n1
Function: bitwise-andc1 n0 n1
Function: bitwise-andc2 n0 n1
Function: bitwise-orc1 n0 n1
Function: bitwise-orc2 n0 n1

[SRFI-151] {srfi-151} これらの手続きは2引数固定です。

nand n0 n1   ≡  (NOT (AND n0 n1))
nor n0 n1    ≡  (NOT (OR n0 n1))
andc1 n0 n1  ≡  (AND (NOT n0) n1)
andc2 n0 n1  ≡  (AND n0 (NOT n1))
orc1 n0 n1   ≡  (OR (NOT n0) n1)
orc2 n0 n1   ≡  (OR n0 (NOT n1))

整数演算

Function: arithmetic-shift n count

[SRFI-151] {srfi-151} 整数ncountビット左シフトします。countが負ならば、 n-countビット右にシフトされることになります。

これは組み込みのashと同じです(基本的なビット演算参照)。

Function: bit-count n

[SRFI-151] {srfi-151} nが正の場合はn中の1であるビットの数を、 nが負の場合はn中の0であるビットの数を返します。

組み込みのlogcountと同じです(基本的なビット演算参照)。

Function: bitwise-if mask n0 n1

[SRFI-151] {srfi-151} 整数を返します。戻り値のn番目のビットは、maskn番目のビットが 1であればn0n番目のビット、0であればn1n番目のビット になります。

(bitwise-if #b10101100 #b00110101 #b11001010)
 ⇒ #b01100110

単一ビットの操作

Function: bit-set? index n

[SRFI-151] {srfi-151} nのLSBから数えてindex番目(0ベース)のビットが1であれば #tを、0であれば#fを返します。

組み込みのlogbit?と同じです(基本的なビット演算参照)。

Function: bit-swap index1 index2 n

[SRFI-151] {srfi-151} nindex1番目のビットとindex2番目のビットを入れ替えた整数を 返します。インデックスは0ベースでLSBから数えます。

Function: any-bit-set? mask n
Function: every-bit-set? mask n

[SRFI-151] {srfi-151} n中で、maskでビットの立っている箇所のビットのいずれか(any-bit-set?) あるいはすべて(every-bit-set?)が1であれば#tを返し、 それ以外では#fを返します。

any-bit-set?は組み込みのlogtestとほぼ同じですが、 logtestは可変長引数です (基本的なビット演算参照)。

Function: first-set-bit n

[SRFI-151] {srfi-151} nを割り切る(expt 2 k)のうち最大のkを返します。別の言い方をすれば、 nのビット列のうち一番右にある1のインデックスを返します。 first-set-bitの名前はそこからきています。

(first-set-bit 0) ⇒ -1   ; edge case
(first-set-bit 1) ⇒ 0
(first-set-bit 2) ⇒ 1
(first-set-bit 15) ⇒ 0
(first-set-bit 16) ⇒ 4

これはGauche組み込みのtwos-exponent-factorと同じです (基本的なビット演算参照)。

ビットフィールド操作

Function: bit-field-any? n start end
Function: bit-field-every? n start end

[SRFI-151] {srfi-151} n中のstartビット目(含む)からendビット目(含まない)までの ビットフィールドのうち、一つでもビットが立っていた場合(bit-field-any?)、 あるいは全てのビットが立っていた場合(bit-field-every?)に#tを、 それ以外に#fを返します。

Function: bit-field-clear n start end
Function: bit-field-set n start end

[SRFI-151] {srfi-151} n中のstartビット目(含む)からendビット目(含まない)までの ビットを全て0あるいは1にした整数値を返します。

Function: bit-field-replace dst src start end

[SRFI-151] {srfi-151} dst中のstartビット目(含む)からendビット目(含まない)までの ビットフィールドを、src中の下位(end-start)ビットで置き換えた 値を返します。

(bit-field-replace #b101010 #b010 1 4) ⇒ #b100100

組み込みのcopy-bit-fieldと同じです(基本的なビット演算参照)。

Function: bit-field-replace-same dst src start end

[SRFI-151] {srfi-151} dst中のstartビット目(含む)からendビット目(含まない)までの ビットフィールドを、 src中の同じ位置にあるビットフィールドに置き換えた値を返します。

(bit-field-replace-same #b111111 #b100100 1 4) ⇒ #b110101
Function: bit-field-rotate n count start end

[SRFI-151] {srfi-151} n中のstartビット目(含む)からendビット目(含まない)までの ビットフィールドを、countビットだけ左にローテートした値を返します。 countが負の場合は-countビットだけ右にローテートします。

(bit-field-rotate #b110100100010000 -1 5 9)
 ⇒ 26768 ;#b110100010010000

(bit-field-rotate #b110100100010000 1 5 9)
 ⇒ 26672 ;#b110100000110000
Function: bit-field-reverse n start end

[SRFI-151] {srfi-151} n中のstartビット目(含む)からendビット目(含まない)までの ビットフィールドを逆順にしたものを返します。

(bit-field-reverse #b10100111 0 8)
 ⇒ 229 ; #b11100101

ビット変換

Function: bits->list n :optional len
Function: bits->vector n :optional len

[SRFI-151] {srfi-151} 非負整数nを、長さlenの真偽値からなるリストまたはベクタにして返します。 ビットはLSBから順に取り出されます。lenが省略された場合は (integer-length n)が使われます。

(bits->vector #b101101110)
  ⇒ #(#f #t #t #t #f #t #t #f #t)

註: srfi-60にはinteger->listという似た手続きがありますが、 ビットの順番が逆です。

Function: list->bits bool-list
Function: vector->bits bool-vector

[SRFI-151] {srfi-151} 真偽値のリストまたはベクタを受け取り、 LSBから対応するビットを詰めた正確な整数を返します。 返り値は負になることはありません。

(list->bits '(#f #t #t #t #f #t #t #f #t))
 ⇒ #b101101110

註: srfi-60にはlist->integerという似た手続きがありますが、 ビットの順番が逆です。

Function: bits bool …

[SRFI-151] {srfi-151} 真偽値boolの列をLSBから順にビットとして詰めた整数を返します。 返り値は負になることはありません。

(bits #f #t #t #t #f #t #t #f #t)
 ⇒ #b101101110

註: srfi-60にはbooleans->integerという似た手続きがありますが、 ビットの順番が逆です。

Foldとunfoldとgenerate

Function: bitwise-fold kons knil n

[SRFI-151] {srfi-151} 整数nのビットを、LSBから(integer-length n)ビット分、順に調べ、 各ビットを真偽値とみなした値とシード値にkonsを適用してゆきます。 konsの戻り値が次のシード値となり、最後のkonsの結果が返されます。

(bitwise-fold cons '() #b10110111)
 ⇒ (#t #f #t #t #f #t #t #t)
Function: bitwise-for-each proc n

[SRFI-151] {srfi-151} 整数nの各ビットを真偽値とみなした値に対して、 LSBから順に(integer-length n)ビット分、procを適用してゆきます。 procの結果は捨てられます。

Function: bitwise-unfold p f g seed

[SRFI-151] {srfi-151} 非負整数をLSBから順に1ビットづつ生成します。 seedは状態の値の初期値を与えます。 各繰り返しにおいて、pが現在の状態の値に適用され、 その結果が真ならば繰り返しは終了しbitwise-unfoldは蓄積されたビットを整数として 返します。 そうでなければ、fが現在の状態の値に適用され、 その結果が真の値なら対応するビットが1に、偽なら0になります。 次いでgが現在の状態の値に適用され、その結果が次の繰り返しにおける状態の値となります。

次の式は、nビット目が、nが素数なら1になっているような100ビット長の整数を返します。

(use math.prime)
(bitwise-unfold (cut = 100 <>)
                small-prime?
                (cut + 1 <>)
                0)
Function: make-bitwise-generator n

[SRFI-151] {srfi-151} 整数nの各ビットをLSBから順に真偽値として生成するようなジェネレータを作って返します。 返されるジェネレータは無限です。

これはgauche.integerbits->generatorと似ていますが、 bits->generatorが作るジェネレータの方はninteger-lengthで止まります。 詳しくはジェネレータを参照してください。


Next: , Previous: , Up: ライブラリモジュール - SRFI   [Contents][Index]