authorgravatar for hemisputnik@proton.mehemisputnik <hemisputnik@proton.me> 2026-02-28 00:46:05+02:00
committergravatar for hemisputnik@proton.mehemisputnik <hemisputnik@proton.me> 2026-02-28 04:15:19+02:00
log925f82da098300ac7015d7897fc5202a7ea275a0
tree3a2e73a63a75566ed0fadc9bca43e1889653e2d1
parent99229ceb55be717aa1995f1a0105bc6b96a910f6
signaturebadge-check Signed by SSH key SHA256:iUK/EffQPyeXTXChJNV0UrxsscinNLxnk+0pu4OGU7Q

std.math.big.int: add log2


2 files changed, 22 insertions(+), 0 deletions(-)

lib/std/math/big/int.zig+5
......@@ -2670,6 +2670,11 @@ pub const Const = struct {
26702670 }
26712671 return @min(result, bits);
26722672 }
2673
2674 /// Calculate the base 2 logarithm, rounded down.
2675 pub fn log2(a: Const) Limb {
2676 return a.limbs.len * @bitSizeOf(Limb) - 1 - @clz(a.limbs[a.limbs.len - 1]);
2677 }
26732678};
26742679
26752680/// An arbitrary-precision big integer along with an allocator which manages the memory.
lib/std/math/big/int_test.zig+17
......@@ -4072,3 +4072,20 @@ test "ctz" {
40724072 try testing.expectEqual(0, limb_max_squared.ctz(@bitSizeOf(Limb) * 2));
40734073 try testing.expectEqual(0, limb_max_squared.ctz(@bitSizeOf(Limb) * 2 + 1));
40744074}
4075
4076test "log2" {
4077 var a = try Managed.init(testing.allocator);
4078 defer a.deinit();
4079
4080 try a.setString(2, "1");
4081 try testing.expectEqual(0, a.toConst().log2());
4082
4083 try a.setString(2, "1111011");
4084 try testing.expectEqual(6, a.toConst().log2());
4085
4086 try a.setString(2, "10100111011101010");
4087 try testing.expectEqual(16, a.toConst().log2());
4088
4089 try a.setString(16, "a22d71c87a9ce406da4f5895f9f3cc3d603192baf6c8a2b5c32649d0465bf188fe799b3618085e49d71bdaec01");
4090 try testing.expectEqual(359, a.toConst().log2());
4091}