@@ -720,26 +720,6 @@ _PyLong_Sign(PyObject *vv)
720720 return Py_SIZE (v ) == 0 ? 0 : (Py_SIZE (v ) < 0 ? -1 : 1 );
721721}
722722
723- /* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
724- 2**k if d is nonzero, else 0. */
725-
726- static const unsigned char BitLengthTable [32 ] = {
727- 0 , 1 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
728- 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5
729- };
730-
731- static int
732- bits_in_digit (digit d )
733- {
734- int d_bits = 0 ;
735- while (d >= 32 ) {
736- d_bits += 6 ;
737- d >>= 6 ;
738- }
739- d_bits += (int )BitLengthTable [d ];
740- return d_bits ;
741- }
742-
743723size_t
744724_PyLong_NumBits (PyObject * vv )
745725{
@@ -757,7 +737,7 @@ _PyLong_NumBits(PyObject *vv)
757737 if ((size_t )(ndigits - 1 ) > SIZE_MAX / (size_t )PyLong_SHIFT )
758738 goto Overflow ;
759739 result = (size_t )(ndigits - 1 ) * (size_t )PyLong_SHIFT ;
760- msd_bits = bits_in_digit (msd );
740+ msd_bits = _Py_bit_length (msd );
761741 if (SIZE_MAX - msd_bits < result )
762742 goto Overflow ;
763743 result += msd_bits ;
@@ -1823,7 +1803,7 @@ long_format_binary(PyObject *aa, int base, int alternate,
18231803 return -1 ;
18241804 }
18251805 size_a_in_bits = (size_a - 1 ) * PyLong_SHIFT +
1826- bits_in_digit (a -> ob_digit [size_a - 1 ]);
1806+ _Py_bit_length (a -> ob_digit [size_a - 1 ]);
18271807 /* Allow 1 character for a '-' sign. */
18281808 sz = negative + (size_a_in_bits + (bits - 1 )) / bits ;
18291809 }
@@ -2639,7 +2619,7 @@ x_divrem(PyLongObject *v1, PyLongObject *w1, PyLongObject **prem)
26392619
26402620 /* normalize: shift w1 left so that its top digit is >= PyLong_BASE/2.
26412621 shift v1 left by the same amount. Results go into w and v. */
2642- d = PyLong_SHIFT - bits_in_digit (w1 -> ob_digit [size_w - 1 ]);
2622+ d = PyLong_SHIFT - _Py_bit_length (w1 -> ob_digit [size_w - 1 ]);
26432623 carry = v_lshift (w -> ob_digit , w1 -> ob_digit , size_w , d );
26442624 assert (carry == 0 );
26452625 carry = v_lshift (v -> ob_digit , v1 -> ob_digit , size_v , d );
@@ -2760,7 +2740,7 @@ _PyLong_Frexp(PyLongObject *a, Py_ssize_t *e)
27602740 * e = 0 ;
27612741 return 0.0 ;
27622742 }
2763- a_bits = bits_in_digit (a -> ob_digit [a_size - 1 ]);
2743+ a_bits = _Py_bit_length (a -> ob_digit [a_size - 1 ]);
27642744 /* The following is an overflow-free version of the check
27652745 "if ((a_size - 1) * PyLong_SHIFT + a_bits > PY_SSIZE_T_MAX) ..." */
27662746 if (a_size >= (PY_SSIZE_T_MAX - 1 ) / PyLong_SHIFT + 1 &&
@@ -3889,8 +3869,8 @@ long_true_divide(PyObject *v, PyObject *w)
38893869 /* Extreme underflow */
38903870 goto underflow_or_zero ;
38913871 /* Next line is now safe from overflowing a Py_ssize_t */
3892- diff = diff * PyLong_SHIFT + bits_in_digit (a -> ob_digit [a_size - 1 ]) -
3893- bits_in_digit (b -> ob_digit [b_size - 1 ]);
3872+ diff = diff * PyLong_SHIFT + _Py_bit_length (a -> ob_digit [a_size - 1 ]) -
3873+ _Py_bit_length (b -> ob_digit [b_size - 1 ]);
38943874 /* Now diff = a_bits - b_bits. */
38953875 if (diff > DBL_MAX_EXP )
38963876 goto overflow ;
@@ -3966,7 +3946,7 @@ long_true_divide(PyObject *v, PyObject *w)
39663946 }
39673947 x_size = Py_ABS (Py_SIZE (x ));
39683948 assert (x_size > 0 ); /* result of division is never zero */
3969- x_bits = (x_size - 1 )* PyLong_SHIFT + bits_in_digit (x -> ob_digit [x_size - 1 ]);
3949+ x_bits = (x_size - 1 )* PyLong_SHIFT + _Py_bit_length (x -> ob_digit [x_size - 1 ]);
39703950
39713951 /* The number of extra bits that have to be rounded away. */
39723952 extra_bits = Py_MAX (x_bits , DBL_MIN_EXP - shift ) - DBL_MANT_DIG ;
@@ -4629,7 +4609,7 @@ _PyLong_GCD(PyObject *aarg, PyObject *barg)
46294609 alloc_b = Py_SIZE (b );
46304610 /* reduce until a fits into 2 digits */
46314611 while ((size_a = Py_SIZE (a )) > 2 ) {
4632- nbits = bits_in_digit (a -> ob_digit [size_a - 1 ]);
4612+ nbits = _Py_bit_length (a -> ob_digit [size_a - 1 ]);
46334613 /* extract top 2*PyLong_SHIFT bits of a into x, along with
46344614 corresponding bits of b into y */
46354615 size_b = Py_SIZE (b );
@@ -5144,7 +5124,7 @@ int_bit_length_impl(PyObject *self)
51445124 return PyLong_FromLong (0 );
51455125
51465126 msd = ((PyLongObject * )self )-> ob_digit [ndigits - 1 ];
5147- msd_bits = bits_in_digit (msd );
5127+ msd_bits = _Py_bit_length (msd );
51485128
51495129 if (ndigits <= PY_SSIZE_T_MAX /PyLong_SHIFT )
51505130 return PyLong_FromSsize_t ((ndigits - 1 )* PyLong_SHIFT + msd_bits );
0 commit comments