code_junkie

Weird bit-shift behavior

Nov 13th, 2011
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. value >> 12
  2. value & 0x00000FFF
  3.  
  4. 6844268 = 11010000110111101101100
  5. >> 12 = 11010000110.111101101100
  6. result = 11010000110
  7. result = 2 + 4 + 128 + 512 + 1024 = 1670
  8.  
  9. 18273 = 100011101100001
  10. 6844268 >> 12 = 11010000110
  11. ^^^^ ^^^ <-- mismatches
  12.  
  13. sock@thebrain:~$ g++ test.cc
  14. sock@thebrain:~$ ./a.out
  15. 6844268 1670 1670
  16. 6844268 1670 1670
  17.  
  18. sock@thebrain:~$ cat test.cc
  19. #include <iostream>
  20. #include <stdio.h>
  21. using namespace std;
  22. int main()
  23. {
  24. unsigned int value = 6844268;
  25. printf("%u %u %un", value, value >> 12, (value >> 12)&0xFFF);
  26. cout << value << " ";
  27. cout << (value>>12) << " ";
  28. value = (value>>12)&0xFFF;
  29. cout << value << endl;
  30. return 0;
  31. };
  32.  
  33. [Function signature: const unsigned char *src, int len, char *dst]
  34. unsigned short *sdst = (unsigned short*) dst;
  35. unsigned short *slt = (unsigned short*) lookup_ext;
  36.  
  37. while (len >= 3) {
  38. unsigned int value = *src++ << 16;
  39. value |= *src++ << 8;
  40. value |= *src++;
  41.  
  42. cout << value << endl;
  43. *sdst++ = slt[value >> 12];
  44. *sdst++ = slt[value & 0x00000FFF];
  45.  
  46. cout << sizeof(unsigned short) << endl << slt[value >> 12] << endl << slt[value & 0x00000FFF] << endl;
  47. len -= 3;
  48. }
  49.  
  50. 6844268 | cout << value
  51. 2 | sizeof(unsigned short)
  52. 18273 | slt... Ohhhh sneaky. I mis-pasted that, nevermind - it's an slt issue [Output's the same now]
  53. 29497
Add Comment
Please, Sign In to add comment