RicardasSim

gcc builtin clz ctz

Feb 17th, 2026 (edited)
3,607
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.67 KB | None | 0 0
  1. // gcc -Wall -Wextra -Wpedantic -Wshadow -Wconversion
  2. // linux 64bit
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6.  
  7. /*
  8. count leading zeros
  9. Returns the number of consecutive zero bits starting from
  10. the most significant bit (MSB) until the first 1 bit.
  11. If x == 0, the result is undefined.
  12.  
  13. int __builtin_clz (unsigned int x)
  14. int __builtin_clzl (unsigned long)
  15. int __builtin_clzll (unsigned long long)
  16.  
  17. count trailing zeros
  18. Returns the number of consecutive zero bits starting
  19. at the least significant bit (LSB) until the first 1.
  20. If x == 0, the result is undefined.
  21.  
  22. int __builtin_ctz (unsigned int x)
  23. int __builtin_ctzl (unsigned long)
  24. int __builtin_ctzll (unsigned long long)
  25. */
  26.  
  27. void PrintBinaryUINT(unsigned int x)
  28. {
  29.     int bits = sizeof(unsigned int) * CHAR_BIT;
  30.    
  31.     for ( int i = bits - 1; i >= 0; i-- )
  32.     {
  33.         unsigned int mask = 1u << i;
  34.         putchar((x & mask) ? '1' : '0');
  35.     }
  36. }
  37.  
  38. int main()
  39. {
  40.     unsigned int val;
  41.  
  42.     puts("---clz---");
  43.  
  44.     val = 16;
  45.  
  46.     /*
  47.         if it is necessary to check whether the value is equal to zero
  48.    
  49.         if (val == 0)
  50.         {
  51.             printf("Input is zero - undefined behavior for __builtin_clz/ctz\n");
  52.             ...
  53.         }
  54.     */
  55.  
  56.     while (val)
  57.     {
  58.         int num = __builtin_clz(val);
  59.         printf ("DEC: %d HEX: %X Bin: ", val, val);
  60.         PrintBinaryUINT(val);
  61.         printf (" Num: %d\n", num);
  62.         val -= 1;
  63.     }
  64.  
  65.     puts("---ctz---");
  66.  
  67.     val = 16;
  68.  
  69.     while (val)
  70.     {
  71.         int num = __builtin_ctz(val);
  72.         printf ("DEC: %d HEX: %X Bin: ", val, val);
  73.         PrintBinaryUINT(val);
  74.         printf (" Num: %d\n", num);
  75.         val -= 1;
  76.     }
  77.  
  78.     return 0;
  79. }
  80.  
  81. /*
  82. Output:
  83.  
  84. ---clz---
  85. DEC: 16 HEX: 10 Bin: 00000000000000000000000000010000 Num: 27
  86. DEC: 15 HEX: F Bin: 00000000000000000000000000001111 Num: 28
  87. DEC: 14 HEX: E Bin: 00000000000000000000000000001110 Num: 28
  88. DEC: 13 HEX: D Bin: 00000000000000000000000000001101 Num: 28
  89. DEC: 12 HEX: C Bin: 00000000000000000000000000001100 Num: 28
  90. DEC: 11 HEX: B Bin: 00000000000000000000000000001011 Num: 28
  91. DEC: 10 HEX: A Bin: 00000000000000000000000000001010 Num: 28
  92. DEC: 9 HEX: 9 Bin: 00000000000000000000000000001001 Num: 28
  93. DEC: 8 HEX: 8 Bin: 00000000000000000000000000001000 Num: 28
  94. DEC: 7 HEX: 7 Bin: 00000000000000000000000000000111 Num: 29
  95. DEC: 6 HEX: 6 Bin: 00000000000000000000000000000110 Num: 29
  96. DEC: 5 HEX: 5 Bin: 00000000000000000000000000000101 Num: 29
  97. DEC: 4 HEX: 4 Bin: 00000000000000000000000000000100 Num: 29
  98. DEC: 3 HEX: 3 Bin: 00000000000000000000000000000011 Num: 30
  99. DEC: 2 HEX: 2 Bin: 00000000000000000000000000000010 Num: 30
  100. DEC: 1 HEX: 1 Bin: 00000000000000000000000000000001 Num: 31
  101. ---ctz---
  102. DEC: 16 HEX: 10 Bin: 00000000000000000000000000010000 Num: 4
  103. DEC: 15 HEX: F Bin: 00000000000000000000000000001111 Num: 0
  104. DEC: 14 HEX: E Bin: 00000000000000000000000000001110 Num: 1
  105. DEC: 13 HEX: D Bin: 00000000000000000000000000001101 Num: 0
  106. DEC: 12 HEX: C Bin: 00000000000000000000000000001100 Num: 2
  107. DEC: 11 HEX: B Bin: 00000000000000000000000000001011 Num: 0
  108. DEC: 10 HEX: A Bin: 00000000000000000000000000001010 Num: 1
  109. DEC: 9 HEX: 9 Bin: 00000000000000000000000000001001 Num: 0
  110. DEC: 8 HEX: 8 Bin: 00000000000000000000000000001000 Num: 3
  111. DEC: 7 HEX: 7 Bin: 00000000000000000000000000000111 Num: 0
  112. DEC: 6 HEX: 6 Bin: 00000000000000000000000000000110 Num: 1
  113. DEC: 5 HEX: 5 Bin: 00000000000000000000000000000101 Num: 0
  114. DEC: 4 HEX: 4 Bin: 00000000000000000000000000000100 Num: 2
  115. DEC: 3 HEX: 3 Bin: 00000000000000000000000000000011 Num: 0
  116. DEC: 2 HEX: 2 Bin: 00000000000000000000000000000010 Num: 1
  117. DEC: 1 HEX: 1 Bin: 00000000000000000000000000000001 Num: 0
  118. */
  119.  
Advertisement