Advertisement
Guest User

Compile-Time Log2

a guest
Jan 28th, 2011
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #define MATH_OP(n, exp) template<UINT a, UINT b> struct n { enum { value = (exp) }; }
  2. #define LOG_OP(n, exp)  template<UINT x> struct n { enum { value = (exp) }; }
  3.  
  4. MATH_OP(And,         a & b);
  5. MATH_OP(Add,         a + b);
  6. MATH_OP(RSh,         a >> b);
  7. MATH_OP(OrRSh,       a | (a >> b));
  8. MATH_OP(AddRSh,      a + (a >> b));
  9.  
  10. LOG_OP(Log2Line01, (OrRSh<x, 1>::value));
  11. LOG_OP(Log2Line02, (OrRSh<x, 2>::value));
  12. LOG_OP(Log2Line03, (OrRSh<x, 4>::value));
  13. LOG_OP(Log2Line04, (OrRSh<x, 8>::value));
  14. LOG_OP(Log2Line05, (OrRSh<x, 16>::value));
  15. LOG_OP(Log2Line06, (RSh<x, 1>::value));
  16. LOG_OP(Log2Line07, (x - ((x >> 1) & 0x55555555)));
  17. LOG_OP(Log2Line08, (((x >> 2) & 0x33333333) + (x & 0x33333333)));
  18. LOG_OP(Log2Line09, (((x >> 4) + x) & 0x0f0f0f0f));
  19. LOG_OP(Log2Line10, (AddRSh<x, 8>::value));
  20. LOG_OP(Log2Line11, (AddRSh<x, 16>::value));
  21. LOG_OP(Log2Line12, (x & 63));
  22.  
  23. template<UINT x> struct Log2Const
  24. {
  25.        enum
  26.        {
  27.               value =
  28.                  Log2Line12<
  29.                   Log2Line11<
  30.                    Log2Line10<
  31.                     Log2Line09<
  32.                      Log2Line08<
  33.                       Log2Line07<
  34.                        Log2Line06<
  35.                         Log2Line05<
  36.                          Log2Line04<
  37.                           Log2Line03<
  38.                            Log2Line02<
  39.                             Log2Line01<x>::value
  40.                            >::value
  41.                           >::value
  42.                          >::value
  43.                         >::value
  44.                        >::value
  45.                       >::value
  46.                      >::value
  47.                     >::value
  48.                    >::value
  49.                   >::value
  50.                  >::value
  51.        };
  52. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement