関数 | |
size_t | ymp_abs_clog2 (const digit_t *digits, size_t len) |
ceil ( log_2 |n| ). より詳しく... | |
size_t | ymp_ilog2 (mp_cref_t self) |
int( log_2 |n| ). より詳しく... |
|
ceil ( log_2 |n| ).
参照 DIGIT_BIT, DIGIT_HIGHEST_BIT, digit_t, と UINT_IS_2POW.
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 } |
|
int( log_2 |n| ).
参照 DIGIT_BIT, DIGIT_HIGHEST_BIT, digit_t, mp_cref_t, と ymp_is_zero.
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 } |