额外减小 发表于 2023-10-12 00:16:14

用bitset写了一个高精度程序(待完善)

就是模拟计算机的操作来进行运算。

打算做一个1024bit的虚拟操作系统。但是我不想用压位高精,这样就不像计算机了。我还是想用计算机最原始的运算方法来写。所以不要说这个代码常数怎么这么大。

代码如下。到时候慢慢完善。

目前做的是正整数的,应该没问题了,欢迎大家来hack.,但是使用补码应该可以很容易实现整数,浮点数的运算。

但是我现在没有时间做了。以后慢慢来。

#include <iostream>
#include <cstdio>
#include <typeinfo>
#include <bitset>
#include <string>
#include <utility>
using namespace std;

const int _bits=8;

// 准备写一个高精度类。用 std::bitset

inline int highest_true(bitset<_bits> x)
{
        for(int i=_bits-1;i>=0;i--)
        {
                if(x)return i;
        }
        return -1;
}

inline bool operator>(bitset<_bits> x,bitset<_bits> y)
{
        for(int i=_bits-1;i>=0;i--)
        {
                if(x&&!y)
                return true;
                if(!x&&y)
                return false;
        }
        return false;
}

inline bool operator<(bitset<_bits> x,bitset<_bits> y)
{
        for(int i=_bits-1;i>=0;i--)
        {
                if(x&&!y)
                return false;
                if(!x&&y)
                return true;
        }
        return false;
}

inline bool operator>=(bitset<_bits> x,bitset<_bits> y)
{
        return !(x<y);
}

inline bool operator<=(bitset<_bits> x,bitset<_bits> y)
{
        return !(x>y);
}

inline bitset<_bits> operator+(bitset<_bits> x,bitset<_bits> y)
{
        bool c;
        bitset<_bits> ans;
        ans=x^y;
        c=x&&y;
        for(int i=1;i<_bits;i++)
        {
                ans=(x&&y&&c)||(x&&!y&&!c)||(!x&&y&&!c)||(!x&&!y&&c);
                c=(x&&y&&c)||(x&&y&&!c)||(!x&&y&&c)||(x&&!y&&c);
        }
        return ans;
}

inline bitset<_bits> operator-(bitset<_bits> x,bitset<_bits> y)
{
        return x+~y+(bitset<_bits>)1;
}

inline bitset<_bits> operator*(bitset<_bits> x,bitset<_bits> y)
{
        bitset<_bits> tmpx=x,tmpy=y,ans;
        while(tmpx.any())
        {
                if(tmpx)
                {
                        ans=ans+tmpy;
                }
                tmpx>>=1;
                tmpy<<=1;
        }
        return ans;
}

inline bitset<_bits> operator/(bitset<_bits> x,bitset<_bits> y)
{
        int ht1=highest_true(x),ht2=highest_true(y);
        if(ht1<ht2)return (bitset<_bits>)0;
        bitset<_bits> tmpx=x,tmpy=y<<(ht1-ht2),ans;
        while(tmpx>=y)
        {
                ans=tmpx>=tmpy;
                if(ans)
                tmpx=tmpx-tmpy;
               
                ans<<=1;
                tmpy>>=1;
        }
        ans<<=(highest_true(tmpy)-ht2);
        return ans;
       
}

inline pair< bitset<_bits> , bitset<_bits> > divmod(bitset<_bits> x,bitset<_bits> y)
{
        int ht1=highest_true(x),ht2=highest_true(y);
        pair< bitset<_bits>,bitset<_bits> > ans_pair;
        if(ht1<ht2)
        {
                ans_pair.first=0;
                ans_pair.second=x;
                return ans_pair;
        }
        bitset<_bits> tmpx=x,tmpy=y<<(ht1-ht2),div;
        while(1)
        {
                cout<<tmpx<<endl<<tmpy<<endl<<div<<endl<<endl;
               
                div=(tmpx>=tmpy);
               
               
                if(div)
                tmpx=tmpx-tmpy;
                if(tmpx<y)
                break;
                div<<=1;
                tmpy>>=1;
        }
        div<<=(highest_true(tmpy)-ht2);
        cout<<highest_true(tmpy)<<' '<<ht2<<endl;
        ans_pair.first=div;
        ans_pair.second=tmpx;
        cout<<endl<<"div: "<<div<<" "<<(highest_true(tmpy)-ht2)<<endl;
        return ans_pair;
}

inline void in_int(bitset<_bits> &x)
{
        int a;
        cin>>a;
        x=a;
}

inline void out_int(bitset<_bits> &x)
{
        string str=x.to_string();
       
        int ans=0,l=str.length();
        for(int i=l-1,j=1;i>=0;i--,j*=2)
        {
                if(str=='1')ans+=j;
        }
        cout<<"output : "<<ans<<endl;
}

int main()
{
       
}
页: [1]
查看完整版本: 用bitset写了一个高精度程序(待完善)