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