Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <time.h>
- typedef long int I32;
- typedef unsigned long int U32;
- typedef long long int I64;
- typedef unsigned long long int U64;
- typedef double F64;
- U64 _rdtsc() {
- register I32 eax asm ("eax");
- register I32 edx asm ("edx");
- asm(
- ".intel_syntax noprefix\n"
- "rdtsc\n"
- // "mov lo, eax\n"
- // "mov hi, edx\n"
- ".att_syntax\n"
- );
- return ((U64)edx << 32) + eax;
- }
- #define bitsPossMaxSize 32
- I32 bitsPossSize;
- U32 bitPoss[bitsPossMaxSize];
- U32 _twistedBitsInit() {
- #define _fillFromN() { \
- for(; i < 32 && n > 0; i++) \
- { \
- bitPoss[i] = n % (i + 1) ; \
- n /= (i + 1); \
- } \
- }
- I32 i = 0;
- U64 n = _rdtsc();
- _fillFromN();
- n = time(NULL);
- _fillFromN();
- bitsPossSize = i;
- #undef _fillFromN
- }
- U32 _reverseBits(U32 n) {
- // #define _step(mask, shift) n = ((n & mask) << shift) | ((n & (mask << shift)) >> shift)
- void _step(U32 mask, U32 shift) {
- n = ((n & mask) << shift) | ((n & (mask << shift)) >> shift);
- }
- _step(0x55555555, 1);
- _step(0x77777777, 2);
- _step(0x0f0f0f0f, 4);
- _step(0x00ff00ff, 8);
- _step(0x0000ffff, 16);
- // #undef _step
- return n;
- }
- F64 _twistedBitsGet() {
- U64 n = _rdtsc();
- //n = (n & 0xffffffff00000000) | ((n & 0xffff0000) >> 16) | ((n & 0xffff) << 16);
- //n |= (n & 1) << 1;
- F64 a = (F64)((n >> 32) ^ _reverseBits(n & 0xffffffff)) / 0xffffffff;
- void _smooth() {
- if(0.25 <= a && a < 0.5)
- a -= 0.26;
- else if(0.5 <= a && a < 0.75)
- a -= 0.52;
- else if(0.75 <= a && a < 1.0)
- a -= 0.78;
- a *= 4;
- }
- //n &= ~(1 << 1);
- //_smooth();
- _smooth();
- _smooth();
- _smooth();
- _smooth();
- if(a < 0.1 && a > 0.7)
- return _twistedBitsGet();
- //else
- return a;
- /*
- U64 ret = 0;
- for(U32 i = 0; i < bitsPossSize; ++i)
- {
- if(n & (1 << (i + bitPoss[i])))
- ret |= 1 << i;
- }
- return ((F64)ret) / (1 << bitsPossSize);
- */
- }
- void main(){
- U32 a[100];
- memset(a, 0, sizeof(a));
- _twistedBitsInit(_rdtsc());
- //printf("%x", _reverseBits(0xffffffff));
- //printf("%x", _reverseBits(0x1));
- //printf("%i\n", bitsPossSize);
- //for(I32 i = 0; i < bitsPossSize; ++i)
- // printf("%i, ", bitPoss[i]);
- for(I32 i = 0; i < 100000; ++i)
- a[(U32)(_twistedBitsGet() * 100)] ++;
- for(I32 i = 0; i < 100; ++i)
- printf("%i\t", i);
- printf("\n");
- for(I32 i = 0; i < 100; ++i)
- printf("%i\t", a[i]);
- printf("\n");
- }
Add Comment
Please, Sign In to add comment