@@ -3451,6 +3451,75 @@ long_sizeof(PyLongObject *v)
34513451 return PyInt_FromSsize_t (res );
34523452}
34533453
3454+ static const unsigned char BitLengthTable [32 ] = {
3455+ 0 , 1 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
3456+ 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5
3457+ };
3458+
3459+ static PyObject *
3460+ long_bit_length (PyLongObject * v )
3461+ {
3462+ PyLongObject * result , * x , * y ;
3463+ Py_ssize_t ndigits , msd_bits = 0 ;
3464+ digit msd ;
3465+
3466+ assert (v != NULL );
3467+ assert (PyLong_Check (v ));
3468+
3469+ ndigits = ABS (Py_SIZE (v ));
3470+ if (ndigits == 0 )
3471+ return PyInt_FromLong (0 );
3472+
3473+ msd = v -> ob_digit [ndigits - 1 ];
3474+ while (msd >= 32 ) {
3475+ msd_bits += 6 ;
3476+ msd >>= 6 ;
3477+ }
3478+ msd_bits += (long )(BitLengthTable [msd ]);
3479+
3480+ if (ndigits <= PY_SSIZE_T_MAX /PyLong_SHIFT )
3481+ return PyInt_FromSsize_t ((ndigits - 1 )* PyLong_SHIFT + msd_bits );
3482+
3483+ /* expression above may overflow; use Python integers instead */
3484+ result = (PyLongObject * )PyLong_FromSsize_t (ndigits - 1 );
3485+ if (result == NULL )
3486+ return NULL ;
3487+ x = (PyLongObject * )PyLong_FromLong (PyLong_SHIFT );
3488+ if (x == NULL )
3489+ goto error ;
3490+ y = (PyLongObject * )long_mul (result , x );
3491+ Py_DECREF (x );
3492+ if (y == NULL )
3493+ goto error ;
3494+ Py_DECREF (result );
3495+ result = y ;
3496+
3497+ x = (PyLongObject * )PyLong_FromLong (msd_bits );
3498+ if (x == NULL )
3499+ goto error ;
3500+ y = (PyLongObject * )long_add (result , x );
3501+ Py_DECREF (x );
3502+ if (y == NULL )
3503+ goto error ;
3504+ Py_DECREF (result );
3505+ result = y ;
3506+
3507+ return (PyObject * )result ;
3508+
3509+ error :
3510+ Py_DECREF (result );
3511+ return NULL ;
3512+ }
3513+
3514+ PyDoc_STRVAR (long_bit_length_doc ,
3515+ "long.bit_length() -> int or long\n\
3516+ \n\
3517+ Number of bits necessary to represent self in binary.\n\
3518+ >>> bin(37L)\n\
3519+ '0b100101'\n\
3520+ >>> (37L).bit_length()\n\
3521+ 6" );
3522+
34543523#if 0
34553524static PyObject *
34563525long_is_finite (PyObject * v )
@@ -3462,6 +3531,8 @@ long_is_finite(PyObject *v)
34623531static PyMethodDef long_methods [] = {
34633532 {"conjugate" , (PyCFunction )long_long , METH_NOARGS ,
34643533 "Returns self, the complex conjugate of any long." },
3534+ {"bit_length" , (PyCFunction )long_bit_length , METH_NOARGS ,
3535+ long_bit_length_doc },
34653536#if 0
34663537 {"is_finite" , (PyCFunction )long_is_finite , METH_NOARGS ,
34673538 "Returns always True." },
0 commit comments