Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- x * 10 = x * 8 + x * 2 = (x << 3) + (x << 1)
- int divide10(int32_t num)
- {
- return num / 10;
- }
- mov eax, 1717986919 ; 66666667H
- imul ecx
- sar edx, 2
- mov eax, edx
- shr eax, 31
- add eax, edx
- int r = (int)((x * 0x66666667L) >> 34);
- r += (r < 0);
- (x * 0x66666667L) >> 34 == [(10 * q + r) * (0x66666667L) / 2^34]
- (2^34 + 6)/10 * (10 * q + r) = q * 2^34 + 6 * q + 0x66666667L * r
- 6 * q + 0x66666667L * r < 6 * 214748364 + 0x66666667L * 9 == 15676630635 < 2^34
- // http://www.hackersdelight.org/divcMore.pdf
- uint32_t divu10(uint32_t n, uint32_t *rem) {
- uint32_t q, r;
- q = (n >> 1) + (n >> 2);
- q = q + (q >> 4);
- q = q + (q >> 8);
- q = q + (q >> 16);
- q = q >> 3;
- // orig: r = n - q*10;
- r = n - ((q << 3) + (q << 1));
- *rem = r > 9 ? r - 10 : r;
- // orig: return q + ((r + 6) >> 4);
- return q + (r > 9);
- }
- uint64_t divu64_10(uint64_t n, uint32_t *rem) {
- uint64_t q, r;
- q = (n >> 1) + (n >> 2);
- q = q + (q >> 4);
- q = q + (q >> 8);
- q = q + (q >> 16);
- q = q + (q >> 32);
- q = q >> 3;
- // orig: r = n - q*10;
- r = n - ((q << 3) + (q << 1));
- *rem = r > 9 ? r - 10 : r;
- // orig: return q + ((r + 6) >> 4);
- return q + (r > 9);
- }
Add Comment
Please, Sign In to add comment