def binaryDivision(int a, int b) {
int result = 0
int sign = 0
if (a < 0) {
sign = sign + 1
a = 0 - a
}
if (b < 0) {
sign = sign - 1
b = 0 - b
}
int limit = a >> 1
if (limit < (1 << 30)) limit = 1 << 30
int origB = b
while (b < limit) {
b = b << 1
}
while (b >= origB) {
result = result << 1
if (a >= b) {
a = a - b
result = result + 1
}
b = b >> 1
}
if (sign != 0) result = 0 - result
return result
}
100000.times {
def RNG = new Random()
int a = RNG.nextInt()
int b = RNG.nextInt()
int expected = a/b
//println "$a $b"
assert binaryDivision
(a
, b
) == expected
}
int divBy10(int x) {
int result = 214748364
for (int i = 32; i > 0; i = i - 1) {
if (x & 1) {
//Integer.parseInt('00011001100110011001100110011001', 2)
result = result + 429496729
}
x = x >> 1
result = result >> 1
}
return result
}
100000.times {
assert divBy10
(it
) == (it
/ 10 as
int) }
ZGVmIGJpbmFyeURpdmlzaW9uKGludCBhLCBpbnQgYikgewogICAgaW50IHJlc3VsdCA9IDAKICAgIGludCBzaWduID0gMAogICAgaWYgKGEgPCAwKSB7CiAgICAgICAgc2lnbiA9IHNpZ24gKyAxCiAgICAgICAgYSA9IDAgLSBhCiAgICB9CiAgICBpZiAoYiA8IDApIHsKICAgICAgICBzaWduID0gc2lnbiAtIDEKICAgICAgICBiID0gMCAtIGIKICAgIH0KICAgIAogICAgaW50IGxpbWl0ID0gYSA+PiAxCiAgICBpZiAobGltaXQgPCAoMSA8PCAzMCkpIGxpbWl0ID0gMSA8PCAzMAogICAgaW50IG9yaWdCID0gYgogICAgd2hpbGUgKGIgPCBsaW1pdCkgewogICAgICAgIGIgPSBiIDw8IDEKICAgIH0KICAgIHdoaWxlIChiID49IG9yaWdCKSB7CiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IDw8IDEKICAgICAgICBpZiAoYSA+PSBiKSB7CiAgICAgICAgICAgIGEgPSBhIC0gYgogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCiAgICAgICAgfQogICAgICAgIGIgPSBiID4+IDEKICAgIH0KICAgIAogICAgaWYgKHNpZ24gIT0gMCkgcmVzdWx0ID0gMCAtIHJlc3VsdAogICAgcmV0dXJuIHJlc3VsdAp9CgoxMDAwMDAudGltZXMgewogICAgZGVmIFJORyA9IG5ldyBSYW5kb20oKQogICAgaW50IGEgPSBSTkcubmV4dEludCgpCiAgICBpbnQgYiA9IFJORy5uZXh0SW50KCkKICAgIGludCBleHBlY3RlZCA9IGEvYgogICAgLy9wcmludGxuICIkYSAkYiIKICAgIGFzc2VydCBiaW5hcnlEaXZpc2lvbihhLCBiKSA9PSBleHBlY3RlZAp9CgppbnQgZGl2QnkxMChpbnQgeCkgewogICAgaW50IHJlc3VsdCA9IDIxNDc0ODM2NAogICAgZm9yIChpbnQgaSA9IDMyOyBpID4gMDsgaSA9IGkgLSAxKSB7CiAgICAgICAgaWYgKHggJiAxKSB7CiAgICAgICAgICAgIC8vSW50ZWdlci5wYXJzZUludCgnMDAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDEnLCAyKQogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyA0Mjk0OTY3MjkKICAgICAgICB9CiAgICAgICAgeCA9IHggPj4gMQogICAgICAgIHJlc3VsdCA9IHJlc3VsdCA+PiAxCiAgICB9CiAgICByZXR1cm4gcmVzdWx0Cn0KCjEwMDAwMC50aW1lcyB7CiAgICBhc3NlcnQgZGl2QnkxMChpdCkgPT0gKGl0IC8gMTAgYXMgaW50KQp9Cg==