00001 #include "multiprec.h"
00002
00017 size_t
00018 ymp_abs_clog2(const digit_t *digits, size_t len)
00019 {
00020 digit_t bit_mask, hd;
00021 size_t ret, i;
00022
00023 if (len==0 || (len==1 && digits[0]==0)) return 0;
00024
00025 ret = len * DIGIT_BIT - 1;
00026
00027 hd = digits[len-1]; bit_mask = DIGIT_HIGHEST_BIT;
00028 while (!(bit_mask & hd))
00029 {
00030 bit_mask >>= 1;
00031 --ret;
00032 }
00033
00034 if (!UINT_IS_2POW(hd)) return ++ret;
00035
00036 i = len - 1;
00037 while (i-- > 0)
00038 {
00039 if (digits[i] != 0) ++ret;
00040 }
00041
00042 return ret;
00043 }
00044
00045
00052 size_t ymp_ilog2(mp_cref_t self)
00053 {
00054 digit_t bit_mask;
00055 size_t ret;
00056 digit_t hd;
00057
00058 if (ymp_is_zero(self)) return 0;
00059
00060 ret = self->used * DIGIT_BIT-1;
00061 hd = self->digits[self->used-1];
00062 bit_mask = DIGIT_HIGHEST_BIT;
00063 while (!(bit_mask & hd))
00064 {
00065 bit_mask >>= 1;
00066 --ret;
00067 }
00068
00069 return ret;
00070 }
00071