data.bits

Bit manipulation functions for unsigned integers.


template <typename T>
inline T rotl(T value, bitindex_t<T> amount) §source

Rotate the specified value left by the specified amount.

Examples
>>> rotl(0x9, 0);
0x9

>>> rotl(0x9, 1);
0x3

>>> rotl(0x9, 2);
0x6

>>> rotl(0x9, 3);
0xC
template <typename T>
inline T rotr(T value, bitindex_t<T> amount) §source

Rotate the specified value right by the specified amount.

Examples
>>> rotr(0x9, 0);
0x9

>>> rotr(0x9, 1);
0xC

>>> rotr(0x9, 2);
0x6

>>> rotr(0x9, 3);
0x3
template <typename T>
inline optional<bitindex_t<T>> highest_one(T value) §source

Find the index of the highest 1 bit in the value. The result is an optional<bitindex_t<T>> with the is_valid field indicating if there are any 1 bits in the value. When is_valid is true then value is the index of the highest 1 bit.

Examples
>>> highest_one(0);
{0x0, 0x0}

>>> highest_one(1);
{0x1, 0x0}

>>> highest_one(0x32);
{0x1, 0x5}
template <typename T>
inline optional<bitindex_t<T>> lowest_one(T value) §source

Find the index of the lowest 1 bit in the value. The result is an optional<bitindex_t<T>> with the is_valid field indicating if there are any 1 bits in the value. When is_valid is true then value is the index of the lowest 1 bit.

Examples
>>> lowest_one(0);
{0x0, 0x0}

>>> lowest_one(1);
{0x1, 0x0}

>>> lowest_one(0x34);
{0x1, 0x2}
template <typename T>
inline bitcount_t<T> pop_count(T value) §source

Return a count of the number of bits set in the value.

Examples
>>> pop_count(0);
0x0

>>> pop_count(1);
0x1

>>> pop_count(0x34);
0x3
template <typename DividendType, typename DivisorType>
inline 
DividendType
divide_and_roundup(DividendType dividend, const DivisorType divisor) §source

Divide dividend by divisor and round the result up. Divisor must be an unsigned power of 2, known at compile time. Calling with (x, 32) returns the equivalent of (x + 31) / 32.

Examples
>>> divide_and_roundup(0, 0x20);
0x0

>>> divide_and_roundup(1, 0x20);
0x1

>>> divide_and_roundup(0x20, 0x20);
0x1

>>> divide_and_roundup(0x81f, 0x40);
0x21
template <typename InputType, typename OutputType>
inline optional<OutputType> roundup_to_pow2(InputType input) §source

Round up a value to the next larger power of two. For example, all values from 33 through 64 (inclusive) round up to 64. OutputType must be at least one bit larger than InputType.

Examples
>>> roundup_to_pow2<uint15, uint16>(0);
{0x0, 0x0}

>>> roundup_to_pow2<int7, int8>(0x1f);
{0x1, 0x20}

>>> roundup_to_pow2<uint7, uint8>(0x20);
{0x1, 0x20}

>>> roundup_to_pow2<uint15, uint16>(0x21);
{0x1, 0x40}
template <typename T>
inline T reverse(T data) §source

Reverse all bits and return the same input data type.

Examples
>>> reverse(0xC);
0x3

>>> reverse<optional<uint1>>({false, 0x1});
{0x1, 0x0}

>>> reverse<uint2[4]>({0, 1, 2, 3});
{0x3, 0x1, 0x2, 0x0}
template <typename T>
inline T reverse_bytes(T data) §source

Reverse input byte-by-byte and return as the same data type.

Examples
>>> reverse_bytes<uint8>(0xC);
0xC

>>> reverse_bytes<uint32>(0xB01DFACE);
0xCEFA1DB0

>>> reverse_bytes<uint8[4]>({0, 1, 2, 3});
{0x3, 0x2, 0x1, 0x0}
template <auto N, typename T>
inline bool[N] mask_greater_equal(T arg) §source

Return array bool[N] with element at i the result of i >= arg.

Example
>>> mask_greater_equal<4>(2);
{0x0, 0x0, 0x1, 0x1}
template <auto N, typename T>
inline bool[N] mask_less_than(T arg) §source

Return array bool[N] with element at i the result of i < arg.

Example
>>> mask_less_than<4>(2);
{0x1, 0x1, 0x0, 0x0}
template <auto N, typename T>
inline bool[N] mask_greater_than(T arg) §source

Return array bool[N] with element at i the result of i > arg.

Example
>>> mask_greater_than<4>(2);
{0x0, 0x0, 0x0, 0x1}
template <auto N, typename T>
inline bool[N] mask_less_equal(T arg) §source

Return array bool[N] with element at i the result of i <= arg.

Example
>>> mask_less_equal<4>(2);
{0x1, 0x1, 0x1, 0x0}
template <typename T>
inline bool reduction((bool, bool) -> bool f, T x) §source

Casts the specified scalar type to an array of booleans and applies the reduction operator to it

template <typename T>
inline bool reduction_and(T x) §source

Verilog style AND reduction operator

template <typename T>
inline bool reduction_or(T x) §source

Verilog style OR reduction operator

template <typename T>
inline bool reduction_xor(T x) §source

Verilog style XOR reduction operator

template <typename T>
inline bool reduction_xnor(T x) §source

Verilog style XNOR reduction operator

template <typename T>
inline bool reduction_nand(T x) §source

Verilog style NAND reduction operator

template <typename T>
inline bool reduction_nor(T x) §source

Verilog style NOR reduction operator

template <typename T>
inline T bitwise_and(T x, T y) §source

AND operator applied to the bits of an arbitrary type.

template <typename T>
inline T bitwise_or(T x, T y) §source

OR operator applied to the bits of an arbitrary type.

template <typename T>
inline T bitwise_xor(T x, T y) §source

XOR operator applied to the bits of an arbitrary type.

template <typename T>
inline T bitwise_nand(T x, T y) §source

NAND operator applied to the bits of an arbitrary type.

template <typename T>
inline T bitwise_nor(T x, T y) §source

NOR operator applied to the bits of an arbitrary type.

template <typename T>
inline T bitwise_xnor(T x, T y) §source

XNOR operator applied to the bits of an arbitrary type.