tango.core.BitManip

This module contains a collection of bit-level operations.

License:

Public Domain

Author:

Sean Kelly
int bsf(uint v) #
Scans the bits in v starting with bit 0, looking for the first set bit.

Returns:

The bit number of the first bit set. The return value is undefined if v is zero.
int bsr(size_t v) #
Scans the bits in v from the most significant bit to the least significant bit, looking for the first set bit.

Returns:

The bit number of the first bit set. The return value is undefined if v is zero.

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import tango.core.BitManip;

int main()
{
    uint v;
    int x;

    v = 0x21;
    x = bsf(v);
    printf("bsf(x%x) = %d\n", v, x);
    x = bsr(v);
    printf("bsr(x%x) = %d\n", v, x);
    return 0;
}

Output:

bsf(x21) = 0
bsr(x21) = 5
int bt(size_t* p, size_t bitnum) #
Tests the bit.
int btc(size_t* p, size_t bitnum) #
Tests and complements the bit.
int btr(size_t* p, size_t bitnum) #
Tests and resets (sets to 0) the bit.
int bts(size_t* p, size_t bitnum) #
Tests and sets the bit.

Params:

pa non-NULL pointer to an array of size_ts.
indexa bit number, starting with bit 0 of p[0], and progressing. It addresses bits like the expression:
1
p[index / (size_t.sizeof*8)] & (1 << (index & ((size_t.sizeof*8) - 1)))

Returns:

A non-zero value if the bit was set, and a zero if it was clear.

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import tango.core.BitManip;

int main()
{
    size_t array[2];

    array[0] = 2;
    array[1] = 0x100;

    printf("btc(array, 35) = %d\n", btc(array, 35));
    printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);

    printf("btc(array, 35) = %d\n", btc(array, 35));
    printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);

    printf("bts(array, 35) = %d\n", bts(array, 35));
    printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);

    printf("btr(array, 35) = %d\n", btr(array, 35));
    printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);

    printf("bt(array, 1) = %d\n", bt(array, 1));
    printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);

    return 0;
}

Output:

btc(array, 35) = 0
array = [0]:x2, [1]:x108
btc(array, 35) = -1
array = [0]:x2, [1]:x100
bts(array, 35) = 0
array = [0]:x2, [1]:x108
btr(array, 35) = -1
array = [0]:x2, [1]:x100
bt(array, 1) = -1
array = [0]:x2, [1]:x100
uint bswap(uint v) #
Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3 becomes byte 0.
ubyte inp(uint port_address) #
ushort inpw(uint port_address) #
uint inpl(uint port_address) #
Reads I/O port at port_address.
ubyte outp(uint port_address, ubyte value) #
ushort outpw(uint port_address, ushort value) #
uint outpl(uint port_address, uint value) #
Writes and returns value to I/O port at port_address.
int popcnt(uint x) #
Calculates the number of set bits in a 32-bit integer.
uint bitswap(uint x) #
Reverses the order of bits in a 32-bit integer.
ulong bitswap(ulong x) #
Reverses the order of bits in a 64-bit integer.