Advertisement
stgatilov

Hex digit to integer (full)

Dec 21st, 2015
492
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6.  
  7. char lut[256];
  8. int hextoint_lut(char x) {
  9.     return lut[uint8_t(x)];
  10. }
  11.  
  12. int hextoint_cond(char x) {
  13.     uint32_t dig = x - '0';
  14.     uint32_t alp = dig + ('0' - 'a' + 10);
  15.     return dig <= 9U ? dig : alp;
  16. }
  17.  
  18. int hextoint_cond2(char x) {
  19.     uint32_t offset = (uint8_t(x) <= uint8_t('9') ? '0' : 'a' - 10);
  20.     return uint8_t(x) - offset;
  21. }
  22.  
  23. int hextoint_bit(char x) {
  24.     int b = uint8_t(x);
  25.     int mask = (('9' - b) >> 31);
  26.     int offset = '0' + (mask & int('a' - '0' - 10));
  27.     return b - offset;
  28. }
  29.  
  30.  
  31.  
  32. int hextoint_bit_ci(char x) {
  33.     int b = uint8_t(x);
  34.     int maskLetter = (('9' - b) >> 31);
  35.     int maskSmall = (('Z' - b) >> 31);
  36.     int offset = '0' + (maskLetter & int('A' - '0' - 10)) + (maskSmall & int('a' - 'A'));
  37.     return b - offset;
  38. }
  39.  
  40.  
  41. int main() {
  42.     const char all[] = {
  43.         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
  44.         'a', 'b', 'c', 'd', 'e', 'f',
  45.         'A', 'B', 'C', 'D', 'E', 'F'
  46.     };
  47.     const char idx[] = {
  48.         0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  49.         10, 11, 12, 13, 14, 15,
  50.         10, 11, 12, 13, 14, 15
  51.     };
  52.     for (int i = 0; i < 22; i++)
  53.         lut[uint8_t(all[i])] = idx[i];
  54.  
  55.     for (int i = 0; i < 16; i++)
  56.         assert(idx[i] == hextoint_lut(all[i]));
  57.     for (int i = 0; i < 16; i++)
  58.         assert(idx[i] == hextoint_cond(all[i]));
  59.     for (int i = 0; i < 16; i++)
  60.         assert(idx[i] == hextoint_cond2(all[i]));
  61.     for (int i = 0; i < 16; i++)
  62.         assert(idx[i] == hextoint_bit(all[i]));
  63.  
  64.     for (int i = 0; i < 22; i++)
  65.         assert(idx[i] == hextoint_bit_ci(all[i]));
  66.  
  67.  
  68.     static const int VALUES = 64<<10;
  69.     static const int TRIES = 16<<10;
  70.     static const double FREQ = 3.4e+9;  //Note write your CPU's frequency here
  71.  
  72.     #define BENCHMARK(func, data) {                                     \
  73.         int sum = 0;                                                    \
  74.         int start = clock();                                            \
  75.         for (int i = 0; i < TRIES; i++)                                 \
  76.             for (int j = 0; j < VALUES; j+=8) {                         \
  77.                 sum += func(data[j + 0]);                               \
  78.                 sum += func(data[j + 1]);                               \
  79.                 sum += func(data[j + 2]);                               \
  80.                 sum += func(data[j + 3]);                               \
  81.                 sum += func(data[j + 4]);                               \
  82.                 sum += func(data[j + 5]);                               \
  83.                 sum += func(data[j + 6]);                               \
  84.                 sum += func(data[j + 7]);                               \
  85.             }                                                           \
  86.         double elapsed = double(clock() - start) / CLOCKS_PER_SEC;      \
  87.         double cycles = elapsed / TRIES / VALUES * FREQ;                \
  88.         printf("%s: %0.3lf sec, %0.1lf cycles  (check: %d)\n",          \
  89.             #func, elapsed, cycles, sum); \
  90.     }
  91.  
  92.     char input[VALUES];
  93.     for (int i = 0; i < VALUES; i++)
  94.         input[i] = all[rand() % 16];
  95.  
  96.     BENCHMARK(hextoint_lut, input);
  97.     BENCHMARK(hextoint_cond, input);
  98.     BENCHMARK(hextoint_cond2, input);
  99.     BENCHMARK(hextoint_bit, input);
  100.  
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement