diff options
author | Damien George <damien.p.george@gmail.com> | 2015-04-25 23:28:10 +0100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2015-04-25 23:28:10 +0100 |
commit | 0f553fe10b14051aca25818b0aeac175c60889e0 (patch) | |
tree | 201b9673fab621f71c8963a0626a4b1ec6ac53d8 | |
parent | 271d18eb08ec488ee45f8e6cd852e8236074f082 (diff) | |
download | micropython-0f553fe10b14051aca25818b0aeac175c60889e0.tar.gz micropython-0f553fe10b14051aca25818b0aeac175c60889e0.zip |
py: Implement power op for long-long implementation of bignum.
-rw-r--r-- | py/objint_longlong.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/py/objint_longlong.c b/py/objint_longlong.c index 5b2c6d3f50..64376e957c 100644 --- a/py/objint_longlong.c +++ b/py/objint_longlong.c @@ -179,6 +179,22 @@ mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) { case MP_BINARY_OP_INPLACE_RSHIFT: return mp_obj_new_int_from_ll(lhs_val >> (int)rhs_val); + case MP_BINARY_OP_POWER: + case MP_BINARY_OP_INPLACE_POWER: { + long long ans = 1; + while (rhs_val > 0) { + if (rhs_val & 1) { + ans *= lhs_val; + } + if (rhs_val == 1) { + break; + } + rhs_val /= 2; + lhs_val *= lhs_val; + } + return mp_obj_new_int_from_ll(ans); + } + case MP_BINARY_OP_LESS: return MP_BOOL(lhs_val < rhs_val); case MP_BINARY_OP_MORE: |