fork download
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. using namespace std;
  5.  
  6. static unsigned short * lookup = NULL;
  7.  
  8. void t1_init()
  9. {
  10. lookup = new unsigned short [1 << 16];
  11. for (int i = 0; i < 1 << 16; ++i)
  12. lookup[i] =
  13. ((i & 0xf000) ? 0 : 0xf000) |
  14. ((i & 0xf00) ? 0 : 0xf00) |
  15. ((i & 0xf0) ? 0 : 0xf0) |
  16. ((i & 0xf) ? 0 : 0xf);
  17. }
  18.  
  19. unsigned int transform1(unsigned int value)
  20. {
  21. return
  22. (lookup[((value >> 0 ) & 0xFFFF)] << 0 ) |
  23. (lookup[((value >> 16) & 0xFFFF)] << 16);
  24. }
  25.  
  26. unsigned int transform2(unsigned int hexval)
  27. {
  28. return
  29. ((hexval & 0xf0000000) ? 0 : 0xf0000000) |
  30. ((hexval & 0xf000000) ? 0 : 0xf000000) |
  31. ((hexval & 0xf00000) ? 0 : 0xf00000) |
  32. ((hexval & 0xf0000) ? 0 : 0xf0000) |
  33. ((hexval & 0xf000) ? 0 : 0xf000) |
  34. ((hexval & 0xf00) ? 0 : 0xf00) |
  35. ((hexval & 0xf0) ? 0 : 0xf0) |
  36. ((hexval & 0xf) ? 0 : 0xf);
  37. }
  38.  
  39. unsigned int transform3(unsigned int n)
  40. {
  41. return ~(n | ((n & 0x77777777) << 1) | ((n & 0x88888888) >> 3)
  42. | ((n & 0x33333333) << 2) | ((n & 0xCCCCCCCC) >> 2)
  43. | ((n & 0x11111111) << 3) | ((n & 0xEEEEEEEE) >> 1));
  44. }
  45.  
  46. unsigned int transform4(unsigned int in) {
  47. return (
  48. ((in & (0xF << 28)) ? 0x0 : (0xF << 28)) |
  49. ((in & (0xF << 24)) ? 0x0 : (0xF << 24)) |
  50. ((in & (0xF << 20)) ? 0x0 : (0xF << 20)) |
  51. ((in & (0xF << 16)) ? 0x0 : (0xF << 16)) |
  52. ((in & (0xF << 12)) ? 0x0 : (0xF << 12)) |
  53. ((in & (0xF << 8)) ? 0x0 : (0xF << 8)) |
  54. ((in & (0xF << 4)) ? 0x0 : (0xF << 4)) |
  55. ((in & (0xF << 0)) ? 0x0 : (0xF << 0))
  56. );
  57. }
  58.  
  59. int main(int c, char * v[])
  60. {
  61. t1_init();
  62. int i, j = 0x34005600, k, l;
  63. bool testing = false;
  64. unsigned int(* transform)(unsigned int) = transform4;
  65. unsigned int(* transform_compare)(unsigned int) = transform4;
  66.  
  67. if (testing)
  68. for (i = 0; i < 1000; ++i)
  69. {
  70. l = j;
  71. k = transform_compare(j & i);
  72. j = transform(j & i);
  73. if (j != k)
  74. cout << "Differing value: " <<
  75. setfill('0') << setw(8) << hex << (l & i) << " -> " <<
  76. setfill('0') << setw(8) << hex << j << ":" <<
  77. setfill('0') << setw(8) << hex << k << endl;
  78. }
  79. else
  80. for (i = 0; i < 10000000; ++i)
  81. {
  82. j = transform(j & i);
  83. j = transform(j & i);
  84. j = transform(j & i);
  85. j = transform(j & i);
  86. j = transform(j & i);
  87. j = transform(j & i);
  88. j = transform(j & i);
  89. j = transform(j & i);
  90. j = transform(j & i);
  91. j = transform(j & i);
  92. }
  93. return j & 0xFFFFFF00;
  94. }
Success #stdin #stdout 1.13s 2852KB
stdin
Standard input is empty
stdout
Standard output is empty