Guest User

Untitled

a guest
Feb 21st, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. x * 10 = x * 8 + x * 2 = (x << 3) + (x << 1)
  2.  
  3. int divide10(int32_t num)
  4. {
  5. return num / 10;
  6. }
  7.  
  8. mov eax, 1717986919 ; 66666667H
  9. imul ecx
  10. sar edx, 2
  11.  
  12. mov eax, edx
  13. shr eax, 31
  14. add eax, edx
  15.  
  16. int r = (int)((x * 0x66666667L) >> 34);
  17. r += (r < 0);
  18.  
  19. (x * 0x66666667L) >> 34 == [(10 * q + r) * (0x66666667L) / 2^34]
  20.  
  21. (2^34 + 6)/10 * (10 * q + r) = q * 2^34 + 6 * q + 0x66666667L * r
  22.  
  23. 6 * q + 0x66666667L * r < 6 * 214748364 + 0x66666667L * 9 == 15676630635 < 2^34
  24.  
  25. // http://www.hackersdelight.org/divcMore.pdf
  26. uint32_t divu10(uint32_t n, uint32_t *rem) {
  27. uint32_t q, r;
  28. q = (n >> 1) + (n >> 2);
  29. q = q + (q >> 4);
  30. q = q + (q >> 8);
  31. q = q + (q >> 16);
  32. q = q >> 3;
  33. // orig: r = n - q*10;
  34. r = n - ((q << 3) + (q << 1));
  35. *rem = r > 9 ? r - 10 : r;
  36.  
  37. // orig: return q + ((r + 6) >> 4);
  38. return q + (r > 9);
  39. }
  40.  
  41.  
  42. uint64_t divu64_10(uint64_t n, uint32_t *rem) {
  43. uint64_t q, r;
  44. q = (n >> 1) + (n >> 2);
  45. q = q + (q >> 4);
  46. q = q + (q >> 8);
  47. q = q + (q >> 16);
  48. q = q + (q >> 32);
  49. q = q >> 3;
  50. // orig: r = n - q*10;
  51. r = n - ((q << 3) + (q << 1));
  52. *rem = r > 9 ? r - 10 : r;
  53.  
  54. // orig: return q + ((r + 6) >> 4);
  55. return q + (r > 9);
  56. }
Add Comment
Please, Sign In to add comment