马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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()
{
}
|