RicardasSim icon

gcc builtin clz ctz

RicardasSim | PRO | 02/18/26 02:37:00 AM UTC (Edited) | 0 ⭐ | 14880 👁️ | Never ⏰ | []
C |

3.67 KB

|

None

|

0 👍

/

0 👎

// gcc -Wall -Wextra -Wpedantic -Wshadow -Wconversion
// linux 64bit
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
 
/*
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;
 
    /*
        if it is necessary to check whether the value is equal to zero
    
        if (val == 0)
        {
            printf("Input is zero - undefined behavior for __builtin_clz/ctz\n");
            ...
        }
    */
 
    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
*/
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎