add bit_length method to int.

This commit is contained in:
ykiko 2024-03-28 19:39:53 +08:00
parent c77fef35a2
commit 6486a497a9
2 changed files with 13 additions and 0 deletions

View File

@ -444,6 +444,14 @@ void init_builtins(VM* _vm) {
return VAR(_CAST(i64, _0) % rhs);
});
_vm->bind(_vm->_t(VM::tp_int), "bit_length(self)", [](VM* vm, ArgsView args) {
i64 x = CAST(i64, args[0]);
if(x < 0) x = -x;
int bits = 0;
while(x){ x >>= 1; bits++; }
return VAR(bits);
});
_vm->bind__repr__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(std::to_string(_CAST(i64, obj))); });
_vm->bind__neg__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(-_CAST(i64, obj)); });
_vm->bind__hash__(VM::tp_int, [](VM* vm, PyObject* obj) { return _CAST(i64, obj); });

View File

@ -52,6 +52,11 @@ assert x == 3
assert str(1) == '1'
assert repr(1) == '1'
# test bit_length
assert (1).bit_length() == 1
assert (2).bit_length() == 2
assert (3).bit_length() == 2
# test int()
assert int() == 0
assert int(True) == 1