diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 20addd09..73ddd61f 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -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); }); diff --git a/tests/01_int.py b/tests/01_int.py index a1cb61a3..79089b2d 100644 --- a/tests/01_int.py +++ b/tests/01_int.py @@ -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