鱼C论坛

 找回密码
 立即注册
查看: 607|回复: 0

[技术交流] 用bitset写了一个高精度程序(待完善)

[复制链接]
发表于 2023-10-12 00:16:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

打算做一个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[i])return i;
        }
        return -1;
}

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

inline bool operator<(bitset<_bits> x,bitset<_bits> y)
{
        for(int i=_bits-1;i>=0;i--)
        {
                if(x[i]&&!y[i])
                return false;
                if(!x[i]&&y[i])
                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[0]=x[0]^y[0];
        c=x[0]&&y[0];
        for(int i=1;i<_bits;i++)
        {
                ans[i]=(x[i]&&y[i]&&c)||(x[i]&&!y[i]&&!c)||(!x[i]&&y[i]&&!c)||(!x[i]&&!y[i]&&c);
                c=(x[i]&&y[i]&&c)||(x[i]&&y[i]&&!c)||(!x[i]&&y[i]&&c)||(x[i]&&!y[i]&&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[0])
                {
                        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[0]=tmpx>=tmpy;
                if(ans[0])
                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[0]=(tmpx>=tmpy);
                
                
                if(div[0])
                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[i]=='1')ans+=j;
        }
        cout<<"output : "<<ans<<endl;
}

int main()
{
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 00:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表