mirror of
https://github.com/ruby/ruby.git
synced 2026-10-29 00:46:26 +08:00
This patch adds the following methods to String class: * String#bit_get(offset, lsb_first: true) -> 1 | 0 | nil * String#bit_set?(offset, lsb_first: true) -> true | false | nil * String#bit_set(offset, lsb_first: true) -> self * String#bit_clear(offset, lsb_first: true) -> self * String#bit_flip(offset, lsb_first: true) -> self * String#bit_count -> Integer * String#bitwise_not -> String * String#bitwise_not! -> self * String#bitwise_and(other) -> String * String#bitwise_and!(other) -> self * String#bitwise_or(other) -> String * String#bitwise_or!(other) -> self * String#bitwise_xor(other) -> String * String#bitwise_xor!(other) -> self Other than implementation, tests, specs, and docs are added. Link: [Feature #22118] ## Note In `string.c`, I wrote some big macro that create method functions and helper functions: * STR_DEFINE_BINARY_BITWISE_METHOD * STR_DEFINE_UNARY_BITWISE_KERNEL * STR_DEFINE_BINARY_BITWISE_KERNEL While using macros like this reduces maintainability, I believe it's acceptable because there are no plans to extend the `bitwise_*` methods beyond this proposal, and the logic is stable. On the other hand, other methods such as `bit_get` and `bit_count` are planned to have argument extensions in the future.
21 lines
700 B
Plaintext
21 lines
700 B
Plaintext
Returns +0+ or +1+ for the bit at zero-based bit +offset+:
|
|
|
|
s = "\xAA" # 0b10101010
|
|
s.bit_get(0) # => 0
|
|
s.bit_get(1) # => 1
|
|
|
|
Returns +nil+ if +offset+ is beyond the end of +self+:
|
|
|
|
s.bit_get(8) # => nil
|
|
|
|
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:
|
|
|
|
s.bit_get(0, lsb_first: false) # => 1
|
|
s.bit_get(1, lsb_first: false) # => 0
|
|
|
|
Raises +IndexError+ if +offset+ is negative.
|
|
Raises +ArgumentError+ if +offset+ is too large to be represented.
|
|
Raises +ArgumentError+ if +lsb_first+ is neither +true+ nor +false+.
|