CCCPaste

gcc builtin clz ctz

// gcc -Wall -Wextra -Wpedantic -Wshadow -Wconversion
// linux 64bit
#include 
#include 
#include 

/*
count leading zeros
Returns the number of consecutive zero bits starting from
the most significant bit (MSB) until the first 1 bit.
If x == 0, the result is undefined.

int __builtin_clz (unsigned int x)
int __builtin_clzl (unsigned long)
int __builtin_clzll (unsigned long long)

count trailing zeros
Returns the number of consecutive zero bits starting
at the least significant bit (LSB) until the first 1.
If x == 0, the result is undefined.

int __builtin_ctz (unsigned int x)
int __builtin_ctzl (unsigned long)
int __builtin_ctzll (unsigned long long)
*/

void PrintBinaryUINT(unsigned int x)
{
    int bits = sizeof(unsigned int) * CHAR_BIT;
    
    for ( int i = bits - 1; i >= 0; i-- )
    {
        unsigned int mask = 1u << i;
        putchar((x & mask) ? '1' : '0');
    }
}

int main()
{
    unsigned int val;

    puts("---clz---");

    val = 16;

    while (val)
    {
        int num = __builtin_clz(val);
        printf ("DEC: %d HEX: %X Bin: ", val, val);
        PrintBinaryUINT(val);
        printf (" Num: %d\n", num);
        val -= 1;
    }

    puts("---ctz---");

    val = 16;

    while (val)
    {
        int num = __builtin_ctz(val);
        printf ("DEC: %d HEX: %X Bin: ", val, val);
        PrintBinaryUINT(val);
        printf (" Num: %d\n", num);
        val -= 1;
    }

    return 0;
}

/*
Output:

---clz---
DEC: 16 HEX: 10 Bin: 00000000000000000000000000010000 Num: 27
DEC: 15 HEX: F Bin: 00000000000000000000000000001111 Num: 28
DEC: 14 HEX: E Bin: 00000000000000000000000000001110 Num: 28
DEC: 13 HEX: D Bin: 00000000000000000000000000001101 Num: 28
DEC: 12 HEX: C Bin: 00000000000000000000000000001100 Num: 28
DEC: 11 HEX: B Bin: 00000000000000000000000000001011 Num: 28
DEC: 10 HEX: A Bin: 00000000000000000000000000001010 Num: 28
DEC: 9 HEX: 9 Bin: 00000000000000000000000000001001 Num: 28
DEC: 8 HEX: 8 Bin: 00000000000000000000000000001000 Num: 28
DEC: 7 HEX: 7 Bin: 00000000000000000000000000000111 Num: 29
DEC: 6 HEX: 6 Bin: 00000000000000000000000000000110 Num: 29
DEC: 5 HEX: 5 Bin: 00000000000000000000000000000101 Num: 29
DEC: 4 HEX: 4 Bin: 00000000000000000000000000000100 Num: 29
DEC: 3 HEX: 3 Bin: 00000000000000000000000000000011 Num: 30
DEC: 2 HEX: 2 Bin: 00000000000000000000000000000010 Num: 30
DEC: 1 HEX: 1 Bin: 00000000000000000000000000000001 Num: 31
---ctz---
DEC: 16 HEX: 10 Bin: 00000000000000000000000000010000 Num: 4
DEC: 15 HEX: F Bin: 00000000000000000000000000001111 Num: 0
DEC: 14 HEX: E Bin: 00000000000000000000000000001110 Num: 1
DEC: 13 HEX: D Bin: 00000000000000000000000000001101 Num: 0
DEC: 12 HEX: C Bin: 00000000000000000000000000001100 Num: 2
DEC: 11 HEX: B Bin: 00000000000000000000000000001011 Num: 0
DEC: 10 HEX: A Bin: 00000000000000000000000000001010 Num: 1
DEC: 9 HEX: 9 Bin: 00000000000000000000000000001001 Num: 0
DEC: 8 HEX: 8 Bin: 00000000000000000000000000001000 Num: 3
DEC: 7 HEX: 7 Bin: 00000000000000000000000000000111 Num: 0
DEC: 6 HEX: 6 Bin: 00000000000000000000000000000110 Num: 1
DEC: 5 HEX: 5 Bin: 00000000000000000000000000000101 Num: 0
DEC: 4 HEX: 4 Bin: 00000000000000000000000000000100 Num: 2
DEC: 3 HEX: 3 Bin: 00000000000000000000000000000011 Num: 0
DEC: 2 HEX: 2 Bin: 00000000000000000000000000000010 Num: 1
DEC: 1 HEX: 1 Bin: 00000000000000000000000000000001 Num: 0
*/