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

instance method String#bit_clear

bit_clear(offset, lsb_first: true) -> selfRuby 4.1 から[permalink][rdoc][edit]
bit_clear(offset, length, lsb_first: true) -> self
bit_clear(range, lsb_first: true) -> self

0 から数えたビット位置 offset のビットを 0 にして self を返します。

length を指定すると、offset から length ビット分を連続して 0 にします。range を指定すると、range が示すビットの範囲を 0 にします。

指定した範囲は全体が self の範囲内に収まっていなければなりません。範囲が self の末尾を超える場合は、切り詰められるのではなく IndexError が発生します。ビット数が 0 の範囲を指定した場合は何もしません(no-op)が、その開始位置が self の末尾を超えている場合は、ビット数が 0 であっても IndexError が発生します。

既定では、各バイト内のビットは最下位ビット(LSB)から最上位ビット(MSB)の順に番号が付きます。lsb_firstfalse を指定すると、バイトの並び順はそのままに、各バイト内のビット番号だけが最上位ビット(MSB)から最下位ビット(LSB)の順になります。

[PARAM] offset:
変更を開始するビットの位置を 0 から数えた整数で指定します。
[PARAM] length:
変更するビット数を指定します。
[PARAM] range:
変更するビットの範囲を Range オブジェクトで指定します。
[PARAM] lsb_first:
バイト内のビットの番号の付け方を指定します。既定は true(最下位ビットが 0 番目)です。false を指定すると最上位ビットが 0 番目になります。
[RETURN]
self を返します。
[EXCEPTION] IndexError:
offset が範囲外の場合、または範囲の一部が self の外に及ぶ場合に発生します。
[EXCEPTION] ArgumentError:
length に負の数を指定した場合に発生します。
[EXCEPTION] ArgumentError:
ビット位置として表現できないほど大きい値を指定した場合に発生します。
[EXCEPTION] ArgumentError:
lsb_firsttruefalse 以外を指定した場合に発生します。
[EXCEPTION] FrozenError:
self が凍結されている場合に発生します。変更するビット数が 0 の場合でも発生します。
s = "\xFF".b
p s.bit_clear(1) # => "\xFD"
p s              # => "\xFD"

s = "\xFF\xFF".b
p s.bit_clear(4, 8) # => "\x0F\xF0"

s = "\xFF\xFF".b
p s.bit_clear(4..11) # => "\x0F\xF0"

[SEE_ALSO] String#bit_set, String#bit_flip