Guest User

Untitled

a guest
Jan 19th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. typedef long int I32;
  5. typedef unsigned long int U32;
  6. typedef long long int I64;
  7. typedef unsigned long long int U64;
  8. typedef double F64;
  9.  
  10. U64 _rdtsc() {
  11. register I32 eax asm ("eax");
  12. register I32 edx asm ("edx");
  13.  
  14. asm(
  15. ".intel_syntax noprefix\n"
  16. "rdtsc\n"
  17. // "mov lo, eax\n"
  18. // "mov hi, edx\n"
  19. ".att_syntax\n"
  20. );
  21.  
  22. return ((U64)edx << 32) + eax;
  23. }
  24.  
  25. #define bitsPossMaxSize 32
  26. I32 bitsPossSize;
  27. U32 bitPoss[bitsPossMaxSize];
  28. U32 _twistedBitsInit() {
  29. #define _fillFromN() { \
  30. for(; i < 32 && n > 0; i++) \
  31. { \
  32. bitPoss[i] = n % (i + 1) ; \
  33. n /= (i + 1); \
  34. } \
  35. }
  36. I32 i = 0;
  37. U64 n = _rdtsc();
  38. _fillFromN();
  39. n = time(NULL);
  40. _fillFromN();
  41. bitsPossSize = i;
  42. #undef _fillFromN
  43. }
  44.  
  45. U32 _reverseBits(U32 n) {
  46. // #define _step(mask, shift) n = ((n & mask) << shift) | ((n & (mask << shift)) >> shift)
  47. void _step(U32 mask, U32 shift) {
  48. n = ((n & mask) << shift) | ((n & (mask << shift)) >> shift);
  49. }
  50. _step(0x55555555, 1);
  51. _step(0x77777777, 2);
  52. _step(0x0f0f0f0f, 4);
  53. _step(0x00ff00ff, 8);
  54. _step(0x0000ffff, 16);
  55. // #undef _step
  56. return n;
  57. }
  58.  
  59. F64 _twistedBitsGet() {
  60. U64 n = _rdtsc();
  61. //n = (n & 0xffffffff00000000) | ((n & 0xffff0000) >> 16) | ((n & 0xffff) << 16);
  62. //n |= (n & 1) << 1;
  63. F64 a = (F64)((n >> 32) ^ _reverseBits(n & 0xffffffff)) / 0xffffffff;
  64.  
  65. void _smooth() {
  66. if(0.25 <= a && a < 0.5)
  67. a -= 0.26;
  68. else if(0.5 <= a && a < 0.75)
  69. a -= 0.52;
  70. else if(0.75 <= a && a < 1.0)
  71. a -= 0.78;
  72.  
  73. a *= 4;
  74. }
  75.  
  76. //n &= ~(1 << 1);
  77.  
  78. //_smooth();
  79. _smooth();
  80. _smooth();
  81. _smooth();
  82. _smooth();
  83.  
  84. if(a < 0.1 && a > 0.7)
  85. return _twistedBitsGet();
  86. //else
  87. return a;
  88. /*
  89. U64 ret = 0;
  90.  
  91. for(U32 i = 0; i < bitsPossSize; ++i)
  92. {
  93. if(n & (1 << (i + bitPoss[i])))
  94. ret |= 1 << i;
  95. }
  96. return ((F64)ret) / (1 << bitsPossSize);
  97. */
  98. }
  99.  
  100.  
  101. void main(){
  102. U32 a[100];
  103. memset(a, 0, sizeof(a));
  104. _twistedBitsInit(_rdtsc());
  105. //printf("%x", _reverseBits(0xffffffff));
  106. //printf("%x", _reverseBits(0x1));
  107. //printf("%i\n", bitsPossSize);
  108. //for(I32 i = 0; i < bitsPossSize; ++i)
  109. // printf("%i, ", bitPoss[i]);
  110. for(I32 i = 0; i < 100000; ++i)
  111. a[(U32)(_twistedBitsGet() * 100)] ++;
  112.  
  113. for(I32 i = 0; i < 100; ++i)
  114. printf("%i\t", i);
  115. printf("\n");
  116.  
  117. for(I32 i = 0; i < 100; ++i)
  118. printf("%i\t", a[i]);
  119. printf("\n");
  120.  
  121. }
Add Comment
Please, Sign In to add comment