From baea6e284e6a1eda46d0421d6f5b72b6cc9dc528 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 17 Apr 2025 08:11:27 +0900 Subject: [PATCH] mruby-bigint (mpz_bits): use lzb() --- mrbgems/mruby-bigint/core/bigint.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index abcdf328b..7bf440e8e 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1251,18 +1251,14 @@ mpz_bits(const mpz_t *x) { if (x->sz == 0 || x->sn == 0) return 0; - // Get the most significant limb (last element in little-endian order) + size_t limb_bits = sizeof(mp_limb) * 8; + + // Get the most significant limb size_t i = x->sz - 1; mp_limb high = x->p[i]; - // Count the number of bits in the most significant limb - size_t bits = 0; - while (high != 0) { - high >>= 1; - bits++; - } - - return i * (sizeof(mp_limb) * 8) + bits; + // Number of bits = total full limbs + significant bits in top limb + return i * limb_bits + (limb_bits - lzb(high)); } static void