——————————————————————————————————————————
template<long N,template<long,typename>class __Alloc>
bool HugeNumberBase<N,__Alloc>::EqualValue(unsigned long value) const{
if(data_[N-1]==value){
for(long i=0;i<N-1;i++)
if(data_[i])
return false;
return true;
}
return false;
}
template<long N,template<long,typename>class __Alloc>
long HugeNumberBase<N,__Alloc>::HighestBit() const{
long at=0;
while(at<N&&!data_[at])
at++;
if(at>=N)
return 0;
long t(0);
while(!((data_[at]<<t)&SignBit))
t++;
return (N-at)*EachBits-t-1;
}
template<long N,template<long,typename>class __Alloc>
long HugeNumberBase<N,__Alloc>::LowestBit() const{
long at(N-1);
while(at>=0&&!data_[at])
at--;
if(at<0)
return 0;
long t(0);
while(!((data_[at]>>t)&1))
t++;
return (N-1-at)*EachBits+t;
}
template<long N,template<long,typename>class __Alloc>
HugeNumberBase<N,__Alloc> & HugeNumberBase<N,__Alloc>::ResetHigherBits(long Position){
long at(N-1-Position/EachBits);
for(long i=0;i<at;i++)
data_[i]=0;
data_[at]&=(1<<(Position%EachBits))-1;
return *this;
}
——————————————————————————————————————————
這段代碼包括4個函數:
EqualValue
HighestBit
LowestBit
ResetHigherBits
函數EqualValue很簡單,即判斷當前大整數是否和參數value相等。首先它看大整數的最低32 bits(data_[N-1])是否和value相等,然後判斷其他高位bits是否爲0。
這個函數存在的原因是:如果用OperatorEqual來判斷大整數與給定的unsigned long是否相等,是“殺雞用牛刀”,會因爲生成臨時HugeNumberBase而降低效率。
函數HighestBit和的功能也很簡單,得到大整數最高(最低)比特1的位置,比如一個64 bits的大整數是0x 30 00 00 00 50 00 00 08,它的最高比特1就是30裏面最高位的那個比特1,位置是61(從0開始算);而它的最低比特1就是08裏最低的比特1,位置是3(從0開始)。
它們的作用清楚了,代碼也就很明朗了。
在HighestBit中:
long at=0;
while(at<N&&!data_[at])
at++;
if(at>=N)
return 0;
找到高位中第一個不是0的data_,如果大整數本來就是0,那麼返回0;
接着在data_[at]找最高位的比特1,這通過把data_[at]向左移t位,再看第31比特位是否爲1來實現:
long t(0);
while(!((data_[at]<<t)&SignBit))
t++;
最後在return裏計算比特1的位置。
在LowestBit則正好相反:
long at(N-1);
while(at>=0&&!data_[at])
at--;
if(at<0)
return 0;
找到低位中第一個不是0的data_,如果大整數本來就是0,那麼返回0;
接着在data_[at]找最低位的比特1,這通過把data_[at]向右移t位,再與1進行And操作來判斷:
long t(0);
while(!((data_[at]>>t)&1))
t++;
最後同樣在return中計算比特1的位置。
函數ResetHigherBits的作用是:把大整數裏所有大於Position的比特位都置0,Position位置從0開始計算。比如0x1234,如果把Position=2以上的所有比特位置0,那麼將變成0x4。
這個過程包含2步:
long at(N-1-Position/EachBits);
for(long i=0;i<at;i++)
data_[i]=0;
根據Position計算出分界點在data_[at]內,然後把data_[at]高位(0 <= i < at)全部置0;
data_[at]&=(1<<(Position%EachBits))-1;
由Position%EachBits計算出在data_[at]內比特0與1的分界位置,然後只保留需要的比特1。