Skip to content
/ bitwise Public

Bitwise: Fast, memory efficient bitwise operations on large binary strings

License

Notifications You must be signed in to change notification settings

kenn/bitwise

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bitwise

Build Status

Fast, memory efficient bitwise operations on large binary strings.

Internally a bit array is represented as a ruby string with Encoding::BINARY encoding, which keeps billions of bits in a workable footprint.

  • 1,000,000 bits = 125KB
  • 10,000,000 bits = 1.25MB
  • 100,000,000 bits = 12.5MB
  • 1,000,000,000 bits = 125MB

If you need a bit storage for ActiveRecord instead, take a look at ActiveFlag.

Install

gem install bitwise

Usage

Set and unset bits:

b = Bitwise.new("\x00")

b.bits
 => "00000000"

b.set_at(1)
b.set_at(4)

b.bits
 => "01001000"

b.unset_at(1)

b.bits
 => "00001000"

b.set_at?(4)
 => true
b.unset_at?(4)
 => false

String-based accessor:

b = Bitwise.new
b.raw = "abc"

b.size
 => 3
b.bits
 => "011000010110001001100011"
b.raw.unpack('C*')
 => [97, 98, 99]

Index-based accessor:

b = Bitwise.new
b.indexes = [1, 2, 4, 8, 16]

b.bits
 => "011010001000000010000000"
b.indexes
 => [1, 2, 4, 8, 16]
b.cardinality
 => 5

b.set_at(10)

b.bits
 => "011010001010000010000000"
b.indexes
 => [1, 2, 4, 8, 10, 16]
b.cardinality
 => 6

Bit-based accessor is also provided for convenience, but be aware that it's not efficient. Use string-based accessor whenever possible.

b = Bitwise.new
b.bits = '0100100010'
b.bits
 => "0100100010000000"

NOT, OR, AND and XOR:

b1 = Bitwise.new
b2 = Bitwise.new
b1.indexes = [1, 2, 3, 5, 6]
b2.indexes = [1, 2, 4, 8, 16]

(~b1).indexes
 => [0, 4, 7]
(b1 | b2).indexes
 => [1, 2, 3, 4, 5, 6, 8, 16]
(b1 & b2).indexes
 => [1, 2]
(b1 ^ b2).indexes
 => [3, 4, 5, 6, 8, 16]

As a bonus, Bitwise.string_not, Bitwise.string_union, Bitwise.string_intersect, and Bitwise.string_xor can be used as a standalone utility to work with any binary string.

Bitwise.string_not "\xF0"
 => "\x0F"
Bitwise.string_union "\xF0","\xFF"
 => "\xFF"
Bitwise.string_intersect "\xF0","\xFF"
 => "\xF0"
Bitwise.string_xor "\xF0","\xFF"
 => "\x0F"

About

Bitwise: Fast, memory efficient bitwise operations on large binary strings

Resources

License

Stars

Watchers

Forks

Packages

No packages published