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