// 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
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎