// 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; /* 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 */