fork download
  1. #include <stdio.h>
  2.  
  3. static unsigned char lookup[256] = {
  4. [0x01]=1, [0x02]=2, [0x04]=3, [0x08]=4, [0x10]=5, [0x20]=6, [0x40]=7, [0x80]=8
  5. };
  6.  
  7. unsigned log2uint(unsigned y) {
  8. unsigned res = lookup[(y >> 0) & 0xFF];
  9. if (res) return res + 0 - 1;
  10. res = lookup[(y >> 8) & 0xFF];
  11. if (res) return res + 8 - 1;
  12. res = lookup[(y >> 16) & 0xFF];
  13. if (res) return res + 16 - 1;
  14. res = lookup[(y >> 24) & 0xFF];
  15. if (res) return res + 24 - 1;
  16. return 0;
  17. }
  18.  
  19. int main(void) {
  20. for (int i = 0 ; i != 32 ; i++) {
  21. printf("%d - %d - %d\n", i, (int)log2uint(1<<i), __builtin_ctz(1<<i));
  22. }
  23. return 0;
  24. }
  25.  
Success #stdin #stdout 0s 10320KB
stdin
Standard input is empty
stdout
0 - 0 - 0
1 - 1 - 1
2 - 2 - 2
3 - 3 - 3
4 - 4 - 4
5 - 5 - 5
6 - 6 - 6
7 - 7 - 7
8 - 8 - 8
9 - 9 - 9
10 - 10 - 10
11 - 11 - 11
12 - 12 - 12
13 - 13 - 13
14 - 14 - 14
15 - 15 - 15
16 - 16 - 16
17 - 17 - 17
18 - 18 - 18
19 - 19 - 19
20 - 20 - 20
21 - 21 - 21
22 - 22 - 22
23 - 23 - 23
24 - 24 - 24
25 - 25 - 25
26 - 26 - 26
27 - 27 - 27
28 - 28 - 28
29 - 29 - 29
30 - 30 - 30
31 - 31 - 31