From e23fd85ebd268e3bbf7dae16655adef009617c3b Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Fri, 19 Dec 2025 16:36:43 +0800 Subject: [PATCH] add `bin` --- src/modules/builtins.c | 31 +++++++++++++++++++++++++++++++ tests/041_str.py | 12 ++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/modules/builtins.c b/src/modules/builtins.c index 8dc10e31..060933cf 100644 --- a/src/modules/builtins.c +++ b/src/modules/builtins.c @@ -83,6 +83,36 @@ static bool builtins_hex(int argc, py_Ref argv) { return true; } +static bool builtins_bin(int argc, py_Ref argv) { + PY_CHECK_ARGC(1); + PY_CHECK_ARG_TYPE(0, tp_int); + + py_i64 val = py_toint(argv); + + if(val == 0) { + py_newstr(py_retval(), "0b0"); + return true; + } + + c11_sbuf ss; + c11_sbuf__ctor(&ss); + + if(val < 0) { + c11_sbuf__write_char(&ss, '-'); + val = -val; + } + c11_sbuf__write_cstr(&ss, "0b"); + bool non_zero = true; + for(int i = 63; i >= 0; i--) { + unsigned char bit = (val >> i) & 1; + if(bit != 0) non_zero = false; + if(!non_zero) c11_sbuf__write_char(&ss, bit ? '1' : '0'); + } + + c11_sbuf__py_submit(&ss, py_retval()); + return true; +} + static bool builtins_iter(int argc, py_Ref argv) { PY_CHECK_ARGC(1); return py_iter(argv); @@ -463,6 +493,7 @@ py_GlobalRef pk_builtins__register() { py_bindfunc(builtins, "repr", builtins_repr); py_bindfunc(builtins, "len", builtins_len); py_bindfunc(builtins, "hex", builtins_hex); + py_bindfunc(builtins, "bin", builtins_bin); py_bindfunc(builtins, "iter", builtins_iter); py_bindfunc(builtins, "next", builtins_next); py_bindfunc(builtins, "hash", builtins_hash); diff --git a/tests/041_str.py b/tests/041_str.py index 02faba89..556358b4 100644 --- a/tests/041_str.py +++ b/tests/041_str.py @@ -193,6 +193,18 @@ assert hex(256) == '0x100' assert hex(257) == '0x101' assert hex(17) == '0x11' +assert bin(-42) == '-0b101010' +assert bin(42) == '0b101010' + +assert bin(0) == '0b0' +assert bin(1) == '0b1' +assert bin(15) == '0b1111' +assert bin(16) == '0b10000' +assert bin(255) == '0b11111111' +assert bin(256) == '0b100000000' +assert bin(257) == '0b100000001' +assert bin(17) == '0b10001' + assert '-'.join(['r', 'u', 'n', 'o', 'o', 'b']) == 'r-u-n-o-o-b' assert (1 != '1') is True