bit_count -> IntegerRuby 4.1 から[permalink][rdoc][edit]bit_count(offset, length, lsb_first: true) -> Integerbit_count(range, lsb_first: true) -> Integer-
selfに含まれる、立っているビット(値が1のビット)の数を返します。ポピュレーションカウント、あるいはハミング重みとも呼ばれます。
引数を指定しない場合は
selfの全バイトを対象に数えます。offsetとlengthを指定すると、0 から数えたビット位置offsetからlengthビット分を対象に数えます。rangeを指定すると、rangeが示すビットの範囲を対象に数えます。対象の範囲が
selfの末尾を超える場合は、実際に存在するビットだけに切り詰めて数えます。範囲の開始位置がselfの末尾以上の場合は0を返します。String#bit_set などの書き込み系メソッドと異なり、範囲外を指定してもエラーにはなりません。既定では、各バイト内のビットは最下位ビット(LSB)から最上位ビット(MSB)の順に番号が付きます。
lsb_firstにfalseを指定すると、バイトの並び順はそのままに、各バイト内のビット番号だけが最上位ビット(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_firstにtrue、false以外を指定した場合に発生します。
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
- [PARAM]