struct BitArray
Overview
BitArray
is an array data structure that compactly stores bits.
Bits externally represented as Bool
s are stored internally as
UInt32
s. The total number of bits stored is set at creation and is
immutable.
Example
require "bit_array"
ba = BitArray.new(12) # => "BitArray[000000000000]"
ba[2] # => false
0.upto(5) { |i| ba[i * 2] = true }
ba # => "BitArray[101010101010]"
ba[2] # => true
Included Modules
Defined in:
bit_array.crConstructors
-
.new(size, initial : Bool = false)
Creates a new
BitArray
of size bits.
Instance Method Summary
- #==(other : BitArray)
-
#[](start : Int, count : Int) : BitArray
Returns count or less (if there aren't enough) elements starting at the given start index.
-
#[](range : Range) : BitArray
Returns all elements that are within the given range.
-
#[]=(index, value : Bool)
Sets the bit at the given index.
-
#dup
Returns a new
BitArray
with all of the same elements. - #hash(hasher)
-
#inspect(io : IO) : Nil
Creates a string representation of self.
-
#invert
Inverts all bits in the array.
-
#size : Int32
The number of bits the BitArray stores
-
#to_s(io : IO) : Nil
Creates a string representation of self.
-
#to_slice : Bytes
Returns a
Bytes
able to read and write bytes from a buffer. -
#toggle(index)
Toggles the bit at the given index.
-
#unsafe_fetch(index : Int) : Bool
Returns the element at the given index, without doing any bounds check.
Instance methods inherited from module Indexable(Bool)
[](index : Int)
[],
[]?(index : Int)
[]?,
bsearch(&block : T -> Bool)
bsearch,
bsearch_index(&block : T, Int32 -> Bool)
bsearch_index,
combinations(size : Int = self.size)
combinations,
dig(index : Int, *subindexes)
dig,
dig?(index : Int, *subindexes)
dig?,
each(&)each
each(*, start : Int, count : Int, &)
each(*, within range : Range, &) each, each_combination(size : Int = self.size, reuse = false, &) : Nil
each_combination(size : Int = self.size, reuse = false) each_combination, each_index(&) : Nil
each_index
each_index(*, start : Int, count : Int, &) each_index, each_permutation(size : Int = self.size, reuse = false, &) : Nil
each_permutation(size : Int = self.size, reuse = false) each_permutation, each_repeated_combination(size : Int = self.size, reuse = false, &) : Nil
each_repeated_combination(size : Int = self.size, reuse = false) each_repeated_combination, empty? : Bool empty?, equals?(other : Indexable, &)
equals?(other, &) equals?, fetch(index : Int, &)
fetch(index, default) fetch, first(&) first, hash(hasher) hash, index(object, offset : Int = 0)
index(offset : Int = 0, &) index, join(separator : String | Char | Number = "") : String join, last : T
last(&) last, last? : T? last?, permutations(size : Int = self.size) : Array(Array(T)) permutations, repeated_combinations(size : Int = self.size) : Array(Array(T)) repeated_combinations, reverse_each(&) : Nil
reverse_each reverse_each, rindex(value, offset = size - 1) : Int32?
rindex(offset = size - 1, &) rindex, sample(random = Random::DEFAULT) sample, size size, to_a : Array(T) to_a, unsafe_fetch(index : Int) unsafe_fetch, values_at(*indexes : Int) values_at
Instance methods inherited from module Enumerable(Bool)
accumulate(initial : U) : Array(U) forall Uaccumulate : Array(T)
accumulate(initial : U, &block : U, T -> U) : Array(U) forall U
accumulate(&block : T, T -> T) : Array(T) accumulate, all?(&)
all?(pattern) : Bool
all? : Bool all?, any?(&)
any?(pattern) : Bool
any? : Bool any?, chunks(&block : T -> U) forall U chunks, compact_map(&) compact_map, count(& : T -> _) : Int32
count(item) : Int32 count, cycle(n, &)
cycle(&) cycle, each(&block : T -> _) each, each_cons(count : Int, reuse = false, &) each_cons, each_cons_pair(& : T, T -> _) : Nil each_cons_pair, each_slice(count : Int, reuse = false, &) each_slice, each_with_index(offset = 0, &) each_with_index, each_with_object(obj, &) each_with_object, empty? : Bool empty?, find(if_none = nil, &) find, first(&)
first(count : Int) : Array(T)
first : T first, first? : T? first?, flat_map(&block : T -> _) flat_map, group_by(&block : T -> U) forall U group_by, in_groups_of(size : Int, filled_up_with : U = nil) forall U
in_groups_of(size : Int, filled_up_with : U = nil, reuse = false, &) forall U in_groups_of, includes?(obj) : Bool includes?, index(& : T -> _) : Int32?
index(obj) : Int32? index, index_by(&block : T -> U) : Hash(U, T) forall U index_by, join(io : IO, separator = "") : Nil
join(separator, io : IO) : Nil
join(separator = "") : String
join(io : IO, separator = "", & : T, IO -> )
join(separator, io : IO, &)
join(separator = "", & : T -> ) join, map(&block : T -> U) forall U map, map_with_index(offset = 0, &block : T, Int32 -> U) forall U map_with_index, max : T max, max? : T? max?, max_by(&block : T -> U) forall U max_by, max_by?(&block : T -> U) forall U max_by?, max_of(&block : T -> U) forall U max_of, max_of?(&block : T -> U) forall U max_of?, min : T min, min? : T? min?, min_by(&block : T -> U) forall U min_by, min_by?(&block : T -> U) forall U min_by?, min_of(&block : T -> U) forall U min_of, min_of?(&block : T -> U) forall U min_of?, minmax : Tuple(T, T) minmax, minmax? : Tuple(T?, T?) minmax?, minmax_by(&block : T -> U) forall U minmax_by, minmax_by?(&block : T -> U) forall U minmax_by?, minmax_of(&block : T -> U) forall U minmax_of, minmax_of?(&block : T -> U) forall U minmax_of?, none?(&)
none?(pattern) : Bool
none? : Bool none?, one?(&)
one?(pattern) : Bool
one? : Bool one?, partition(&) partition, product(initial : Number)
product
product(initial : Number, &)
product(&) product, reduce(memo, &)
reduce(&) reduce, reduce?(&) reduce?, reject(&block : T -> )
reject(type : U.class) forall U
reject(pattern) : Array(T) reject, sample(n : Int, random = Random::DEFAULT) : Array(T)
sample(random = Random::DEFAULT) : T sample, select(&block : T -> )
select(type : U.class) forall U
select(pattern) : Array(T) select, size : Int32 size, skip(count : Int) skip, skip_while(&) skip_while, sum(initial)
sum
sum(initial, &)
sum(&) sum, take_while(&) take_while, tally : Hash(T, Int32) tally, to_a to_a, to_h
to_h(&block : T -> Tuple(K, V)) forall K, V to_h, to_set : Set(T) to_set, zip(*others : Indexable | Iterable | Iterator, &)
zip(*others : Indexable | Iterable | Iterator) zip, zip?(*others : Indexable | Iterable | Iterator, &)
zip?(*others : Indexable | Iterable | Iterator) zip?
Class methods inherited from module Enumerable(Bool)
element_type(x)
element_type
Instance methods inherited from module Iterable(Bool)
chunk(reuse = false, &block : T -> U) forall U
chunk,
chunk_while(reuse : Bool | Array(T) = false, &block : T, T -> B) forall B
chunk_while,
cycle(n)cycle cycle, each each, each_cons(count : Int, reuse = false) each_cons, each_slice(count : Int, reuse = false) each_slice, each_with_index(offset = 0) each_with_index, each_with_object(obj) each_with_object, slice_after(reuse : Bool | Array(T) = false, &block : T -> B) forall B
slice_after(pattern, reuse : Bool | Array(T) = false) slice_after, slice_before(reuse : Bool | Array(T) = false, &block : T -> B) forall B
slice_before(pattern, reuse : Bool | Array(T) = false) slice_before, slice_when(reuse : Bool | Array(T) = false, &block : T, T -> B) forall B slice_when
Instance methods inherited from struct Struct
==(other) : Bool
==,
hash(hasher)
hash,
inspect(io : IO) : Nil
inspect,
pretty_print(pp) : Nil
pretty_print,
to_s(io : IO) : Nil
to_s
Instance methods inherited from struct Value
==(other : JSON::Any)==(other : YAML::Any)
==(other) ==, dup dup
Instance methods inherited from class Object
! : Bool
!,
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other : JSON::Any)===(other : YAML::Any)
===(other) ===, =~(other) =~, as(type : Class) as, as?(type : Class) as?, class class, dup dup, hash(hasher)
hash hash, in?(collection : Object) : Bool
in?(*values : Object) : Bool in?, inspect(io : IO) : Nil
inspect : String inspect, is_a?(type : Class) : Bool is_a?, itself itself, nil? : Bool nil?, not_nil! not_nil!, pretty_inspect(width = 79, newline = "\n", indent = 0) : String pretty_inspect, pretty_print(pp : PrettyPrint) : Nil pretty_print, responds_to?(name : Symbol) : Bool responds_to?, tap(&) tap, to_json(io : IO) : Nil
to_json : String to_json, to_pretty_json(indent : String = " ") : String
to_pretty_json(io : IO, indent : String = " ") : Nil to_pretty_json, to_s(io : IO) : Nil
to_s : String to_s, to_yaml(io : IO) : Nil
to_yaml : String to_yaml, try(&) try, unsafe_as(type : T.class) forall T unsafe_as
Class methods inherited from class Object
from_json(string_or_io, root : String)from_json(string_or_io) from_json, from_yaml(string_or_io : String | IO) from_yaml
Constructor Detail
Creates a new BitArray
of size bits.
initial optionally sets the starting value, true
or false
, for all bits
in the array.
Instance Method Detail
Returns count or less (if there aren't enough) elements starting at the given start index.
Negative indices count backward from the end of the array (-1 is the last element). Additionally, an empty array is returned when the starting index for an element range is at the end of the array.
Raises IndexError
if the starting index is out of range.
require "bit_array"
ba = BitArray.new(5)
ba[0] = true; ba[2] = true; ba[4] = true
ba # => BitArray[10101]
ba[-3, 3] # => BitArray[101]
ba[6, 1] # raise indexError
ba[1, 2] # => BitArray[01]
ba[5, 1] # => BitArray[]
Returns all elements that are within the given range.
Negative indices count backward from the end of the array (-1 is the last element). Additionally, an empty array is returned when the starting index for an element range is at the end of the array.
Raises IndexError
if the starting index is out of range.
require "bit_array"
ba = BitArray.new(5)
ba[0] = true; ba[2] = true; ba[4] = true
ba # => BitArray[10101]
ba[1..3] # => BitArray[010]
ba[4..7] # => BitArray[1]
ba[6..10] # raise IndexError
ba[5..10] # => BitArray[]
ba[-2...-1] # => BitArray[0]
Sets the bit at the given index.
Negative indices can be used to start counting from the end of the array.
Raises IndexError
if trying to access a bit outside the array's range.
require "bit_array"
ba = BitArray.new(5)
ba[3] = true
Creates a string representation of self.
require "bit_array"
ba = BitArray.new(5)
ba.to_s # => "BitArray[00000]"
Inverts all bits in the array. Falses become true
and vice versa.
require "bit_array"
ba = BitArray.new(5)
ba[2] = true; ba[3] = true
ba # => BitArray[00110]
ba.invert
ba # => BitArray[11001]
Creates a string representation of self.
require "bit_array"
ba = BitArray.new(5)
ba.to_s # => "BitArray[00000]"
Returns a Bytes
able to read and write bytes from a buffer.
The slice will be long enough to hold all the bits groups in bytes despite the UInt32
internal representation.
It's useful for reading and writing a bit array from a byte buffer directly.
WARNING: It is undefined behaviour to set any of the unused bits of a bit array to
true
via a slice.
Toggles the bit at the given index. A false bit becomes a true
bit, and
vice versa.
Negative indices can be used to start counting from the end of the array.
Raises IndexError
if trying to access a bit outside the array's range.
require "bit_array"
ba = BitArray.new(5)
ba[3] # => false
ba.toggle(3)
ba[3] # => true
Returns the element at the given index, without doing any bounds check.
Indexable
makes sure to invoke this method with index in 0...size
,
so converting negative indices to positive ones is not needed here.
Clients never invoke this method directly. Instead, they access
elements with #[](index)
and #[]?(index)
.
This method should only be directly invoked if you are absolutely sure the index is in bounds, to avoid a bounds check for a small boost of performance.