Skip to content

Preview Ruby 4.1 is a preview. It can change before the final release. Switch to Ruby 4.0 →

instance method · added in Ruby 4.1

String#bit_set

bit_set(offset, lsb_first: true) → self
bit_set(offset, length, lsb_first: true) → self
bit_set(range, lsb_first: true) → self

Sets the bit at zero-based bit offset to 1; returns self:

Example
s = "\x00"
s.bit_set(1) # => "\x02"
s            # => "\x02"

With length, sets the length consecutive bits beginning at offset; with a Range, sets the bits covered by range:

Example
s = "\x00\x00"
s.bit_set(4, 8)  # => "\xF0\x0F"
s = "\x00\x00"
s.bit_set(4..11) # => "\xF0\x0F"

The entire region must lie within self; a region that extends beyond the end raises IndexError rather than being clamped. Writing zero bits is a no-op, but even an empty region raises IndexError when it begins beyond the end of self.

By default, bits within each byte are numbered from least-significant to most-significant. If lsb_first is false, byte order is unchanged but bits within each byte are numbered from most-significant to least-significant:

Example
s = "\x00"
s.bit_set(1, lsb_first: false) # => "\x40"
s = "\x00\x00"
s.bit_set(4, 8, lsb_first: false) # => "\x0F\xF0"

Raises IndexError if offset is out of range, or if any part of the region lies outside self. Raises ArgumentError if length is negative. Raises ArgumentError if a bit position is too large to be represented. Raises ArgumentError if lsb_first is neither true nor false. Raises FrozenError if self is frozen, even when writing zero bits.

Ruby version changes

  1. 4.1