Ruby 4.1 リファレンスマニュアル

instance method String#bit_count

bit_count -> IntegerRuby 4.1 から[permalink][rdoc][edit]
bit_count(offset, length, lsb_first: true) -> Integer
bit_count(range, lsb_first: true) -> Integer

self に含まれる、立っているビット(値が 1 のビット)の数を返します。

ポピュレーションカウント、あるいはハミング重みとも呼ばれます。

引数を指定しない場合は self の全バイトを対象に数えます。

offsetlength を指定すると、0 から数えたビット位置 offset から length ビット分を対象に数えます。range を指定すると、range が示すビットの範囲を対象に数えます。

対象の範囲が self の末尾を超える場合は、実際に存在するビットだけに切り詰めて数えます。範囲の開始位置が self の末尾以上の場合は 0 を返します。String#bit_set などの書き込み系メソッドと異なり、範囲外を指定してもエラーにはなりません。

既定では、各バイト内のビットは最下位ビット(LSB)から最上位ビット(MSB)の順に番号が付きます。lsb_firstfalse を指定すると、バイトの並び順はそのままに、各バイト内のビット番号だけが最上位ビット(MSB)から最下位ビット(LSB)の順になります。ビット番号の付け方が結果に影響するのは範囲がバイト境界に揃っていない場合だけで、引数無しの形は lsb_first に関係なく同じ結果になります。

[PARAM] offset:
数える範囲の開始位置を 0 から数えた整数で指定します。
[PARAM] length:
数える範囲の長さをビット数で指定します。
[PARAM] range:
数える範囲を Range オブジェクトで指定します。
[PARAM] lsb_first:
バイト内のビットの番号の付け方を指定します。既定は true(最下位ビットが 0 番目)です。false を指定すると最上位ビットが 0 番目になります。
[RETURN]
対象の範囲に含まれる、立っているビットの数を返します。
[EXCEPTION] IndexError:
offset または range の端点に負の値を指定した場合に発生します。
[EXCEPTION] ArgumentError:
length に負の数を指定した場合に発生します。
[EXCEPTION] ArgumentError:
ビット位置として表現できないほど大きい値を指定した場合に発生します。
[EXCEPTION] ArgumentError:
lsb_firsttruefalse 以外を指定した場合に発生します。
p "\x00".b.bit_count # => 0
p "\xFF".b.bit_count # => 8
p "\xAA".b.bit_count # => 4

data = "\xFF\x00\xF0".b
p data.bit_count(0, 8)   # => 8
p data.bit_count(8, 8)   # => 0
p data.bit_count(0..7)   # => 8
p data.bit_count(8...16) # => 0
p data.bit_count(16..)   # => 4

p data.bit_count(16, 100) # => 4
p data.bit_count(100, 8)  # => 0

p "\xF0".b.bit_count(0, 4)                   # => 0
p "\xF0".b.bit_count(0, 4, lsb_first: false) # => 4

[SEE_ALSO] Integer#bit_count, String#bit_get