abit v0.2.0 Abit View Source

Use :atomics as a bit array or as an array of N-bit counters.

Erlang atomics documentation

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

Link to this function

bit_at(ref, bit_index)

View Source
bit_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

Returns position of bit in :atomics.

Returns a 2 tuple containing:

  • atomics_index - the index of the integer in atomics where the bit is located
  • bit_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}
Link to this function

hamming_distance(ref_l, ref_r)

View Source
hamming_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
Link to this function

intersect(ref_a, ref_b)

View Source
intersect(reference(), reference()) :: reference()

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.

Link to this function

set_bit_at(ref, bit_index, bit)

View Source
set_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
Link to this function

set_bits_count(ref)

View Source
set_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