Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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
- */
Advertisement