Advertisement
Guest User

Untitled

a guest
Dec 29th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 KB | None | 0 0
  1. #include <limits.h>
  2.  
  3. #define ilog2(n)                \
  4. (                       \
  5.         (n) < 2 ? 0 :           \
  6.         (n) & (1ULL << 63) ? 63 :   \
  7.         (n) & (1ULL << 62) ? 62 :   \
  8.         (n) & (1ULL << 61) ? 61 :   \
  9.         (n) & (1ULL << 60) ? 60 :   \
  10.         (n) & (1ULL << 59) ? 59 :   \
  11.         (n) & (1ULL << 58) ? 58 :   \
  12.         (n) & (1ULL << 57) ? 57 :   \
  13.         (n) & (1ULL << 56) ? 56 :   \
  14.         (n) & (1ULL << 55) ? 55 :   \
  15.         (n) & (1ULL << 54) ? 54 :   \
  16.         (n) & (1ULL << 53) ? 53 :   \
  17.         (n) & (1ULL << 52) ? 52 :   \
  18.         (n) & (1ULL << 51) ? 51 :   \
  19.         (n) & (1ULL << 50) ? 50 :   \
  20.         (n) & (1ULL << 49) ? 49 :   \
  21.         (n) & (1ULL << 48) ? 48 :   \
  22.         (n) & (1ULL << 47) ? 47 :   \
  23.         (n) & (1ULL << 46) ? 46 :   \
  24.         (n) & (1ULL << 45) ? 45 :   \
  25.         (n) & (1ULL << 44) ? 44 :   \
  26.         (n) & (1ULL << 43) ? 43 :   \
  27.         (n) & (1ULL << 42) ? 42 :   \
  28.         (n) & (1ULL << 41) ? 41 :   \
  29.         (n) & (1ULL << 40) ? 40 :   \
  30.         (n) & (1ULL << 39) ? 39 :   \
  31.         (n) & (1ULL << 38) ? 38 :   \
  32.         (n) & (1ULL << 37) ? 37 :   \
  33.         (n) & (1ULL << 36) ? 36 :   \
  34.         (n) & (1ULL << 35) ? 35 :   \
  35.         (n) & (1ULL << 34) ? 34 :   \
  36.         (n) & (1ULL << 33) ? 33 :   \
  37.         (n) & (1ULL << 32) ? 32 :   \
  38.         (n) & (1ULL << 31) ? 31 :   \
  39.         (n) & (1ULL << 30) ? 30 :   \
  40.         (n) & (1ULL << 29) ? 29 :   \
  41.         (n) & (1ULL << 28) ? 28 :   \
  42.         (n) & (1ULL << 27) ? 27 :   \
  43.         (n) & (1ULL << 26) ? 26 :   \
  44.         (n) & (1ULL << 25) ? 25 :   \
  45.         (n) & (1ULL << 24) ? 24 :   \
  46.         (n) & (1ULL << 23) ? 23 :   \
  47.         (n) & (1ULL << 22) ? 22 :   \
  48.         (n) & (1ULL << 21) ? 21 :   \
  49.         (n) & (1ULL << 20) ? 20 :   \
  50.         (n) & (1ULL << 19) ? 19 :   \
  51.         (n) & (1ULL << 18) ? 18 :   \
  52.         (n) & (1ULL << 17) ? 17 :   \
  53.         (n) & (1ULL << 16) ? 16 :   \
  54.         (n) & (1ULL << 15) ? 15 :   \
  55.         (n) & (1ULL << 14) ? 14 :   \
  56.         (n) & (1ULL << 13) ? 13 :   \
  57.         (n) & (1ULL << 12) ? 12 :   \
  58.         (n) & (1ULL << 11) ? 11 :   \
  59.         (n) & (1ULL << 10) ? 10 :   \
  60.         (n) & (1ULL <<  9) ?  9 :   \
  61.         (n) & (1ULL <<  8) ?  8 :   \
  62.         (n) & (1ULL <<  7) ?  7 :   \
  63.         (n) & (1ULL <<  6) ?  6 :   \
  64.         (n) & (1ULL <<  5) ?  5 :   \
  65.         (n) & (1ULL <<  4) ?  4 :   \
  66.         (n) & (1ULL <<  3) ?  3 :   \
  67.         (n) & (1ULL <<  2) ?  2 :   \
  68.         1               \
  69.  )
  70.  
  71. /**
  72.  * roundup_pow_of_two - round the given value up to nearest power of two
  73.  * @n: parameter
  74.  *
  75.  * round the given value up to the nearest power of two
  76.  * - the result is undefined when n == 0
  77.  * - this can be used to initialise global variables from constant data
  78.  */
  79. #define roundup_pow_of_two(n)           \
  80. (                       \
  81.         (n == 1) ? 1 :          \
  82.         (1UL << (ilog2((n) - 1) + 1))   \
  83. )
  84.  
  85. main()
  86. {
  87.     unsigned int nr;
  88.  
  89.     for (nr = 1; nr < 0x40000000; nr++) {
  90.         if (1 << (32 - __builtin_clz(nr)) != roundup_pow_of_two(nr + 1)) {
  91.             printf("nr=%d\n", nr);
  92.             break;
  93.         }
  94.     }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement