module Ronin::Support::Binary::BitFlip::Integer
Methods for bit-flipping Integers.
Public Class Methods
bit_flips(int,bits)
click to toggle source
Returns every bit flip in the integer.
@param [Integer, Range(Integer
)] bits
The number of bits to flip or a range of bit indexes to flip.
@return [Array<Integer>]
The bit-flipped integers.
@raise [ArgumentError]
The given bits must be either a Range or an Integer.
@example bit-flip all eight bits:
0x41.bit_flips(8)
@example bit-flip bits 8-16:
0xffff.bit_flips(8...16)
@see Integer#bit_flips
# File lib/ronin/support/binary/bit_flip.rb, line 102 def self.bit_flips(int,bits) each_bit_flip(int,bits).to_a end
each_bit_flip(int,bits) { |int ^ mask| ... }
click to toggle source
Enumerates over every bit flip in the integer.
@param [Integer, Range(Integer
)] bits
The number of bits to flip or a range of bit indexes to flip.
@yield [int]
If a block is given, it will be passed each bit-flipped integer.
@yieldparam [Integer] int
The integer but with one of it's bits flipped.
@return [Enumerator]
If no block is given, an Enumerator object will be returned.
@raise [ArgumentError]
The given bits must be either a Range or an Integer.
@example bit-flip all eight bits:
Binary::BitFlip::Byte.each_bit_flip(0x41,8) { |int| puts "%.8b" % int }
@example bit-flip bits 8-16:
Binary::BitFlip::Byte.each_bit_flip(0xffff,8...16) { |int| puts "%.16b" % int }
@see Integer#each_bit_flip
# File lib/ronin/support/binary/bit_flip.rb, line 65 def self.each_bit_flip(int,bits,&block) return enum_for(__method__,int,bits) unless block_given? bits = case bits when ::Range then bits when ::Integer then (0...bits) else raise(ArgumentError,"bits must be an Integer or a Range: #{bits.inspect}") end bits.each do |bit_index| mask = 1 << bit_index yield int ^ mask end end