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