abit v0.2.0 Abit View Source
Use :atomics
as a bit array or as an array of N-bit counters.
The Abit
module (this module) has functions to use :atomics
as a bit array.
The bit array is zero indexed.
The Abit.Counter
module has functions to use :atomics
as an array of N-bit
counters.
The Abit.Bitmask
functions help working with bitmasks.
Link to this section Summary
Functions
Returns bit at bit_index
in atomic ref
.
Returns total count of bits in atomics ref
.
Returns position of bit in :atomics
.
Returns the bitwise hamming distance between the two
given :atomics
references ref_l
and ref_r
.
Bit intersection of atomics using Bitwise AND operator.
Merge bits of atomics ref_a
& ref_b
using the
bitwise OR operator.
Sets the bit at bit_index
to bit
in the atomics ref
.
Returns number of bits set to 1 in atomics array ref
.
Link to this section Functions
bit_at(ref, bit_index)
View Sourcebit_at(reference(), non_neg_integer()) :: 0 | 1
Returns bit at bit_index
in atomic ref
.
Examples
iex> ref = :atomics.new(1, signed: false)
iex> ref |> :atomics.put(1, 3)
iex> Abit.bit_at(ref, 0)
1
iex> Abit.bit_at(ref, 1)
1
iex> Abit.bit_at(ref, 2)
0
Returns total count of bits in atomics ref
.
:atomics
are 64 bit integers so total
count of bits is size * 64.
Examples
iex> ref = :atomics.new(1, signed: false)
iex> Abit.bit_count(ref)
64
iex> ref2 = :atomics.new(2, signed: false)
iex> Abit.bit_count(ref2)
128
bit_position(bit_index)
View Sourcebit_position(non_neg_integer()) :: {non_neg_integer(), non_neg_integer()}
Returns position of bit in :atomics
.
Returns a 2 tuple containing:
atomics_index
- the index of the integer in atomics where the bit is locatedbit_index
- the index of the bit in the integer
Examples
iex> Abit.bit_position(0)
{1, 0}
iex> Abit.bit_position(11)
{1, 11}
iex> Abit.bit_position(64)
{2, 0}
hamming_distance(ref_l, ref_r)
View Sourcehamming_distance(reference(), reference()) :: non_neg_integer()
Returns the bitwise hamming distance between the two
given :atomics
references ref_l
and ref_r
.
Raises ArgumentError if the size of ref_l
and ref_r
don't equal.
Examples
iex> ref_l = :atomics.new(10, signed: false)
iex> ref_r = :atomics.new(10, signed: false)
iex> Abit.hamming_distance(ref_l, ref_r)
0
iex> ref_l |> :atomics.put(1, 7)
iex> Abit.hamming_distance(ref_l, ref_r)
3
Bit intersection of atomics using Bitwise AND operator.
Returns ref_a
mutated.
Merge bits of atomics ref_a
& ref_b
using the
bitwise OR operator.
ref_b
will be merged into ref_a
.
Returns ref_a
mutated.
set_bit_at(ref, bit_index, bit)
View Sourceset_bit_at(reference(), non_neg_integer(), 0 | 1) :: :ok
Sets the bit at bit_index
to bit
in the atomics ref
.
Returns :ok
.
Examples
iex> ref = :atomics.new(1, signed: false)
iex> ref |> Abit.set_bit_at(0, 1)
iex> ref |> :atomics.get(1)
1
iex> ref |> Abit.set_bit_at(0, 0)
:ok
iex> ref |> :atomics.get(1)
0
set_bits_count(ref)
View Sourceset_bits_count(reference()) :: non_neg_integer()
Returns number of bits set to 1 in atomics array ref
.
Examples
iex> ref = :atomics.new(1, signed: false)
iex> ref |> :atomics.put(1, 3)
iex> Abit.set_bits_count(ref)
2
iex> ref2 = :atomics.new(1, signed: false)
iex> Abit.set_bits_count(ref2)
0