大整數類的實現(6)(原創)

 2)

——————————————————————————————————————————

    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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章