改正:https:
#include <iostream>
#include <bitset>
#include <string>
#include <conio.h>
#include <QString>
using namespace std;
const int n=28;
std::bitset<n> RightMove
(int RightMoveBit,std::bitset<n> WhoRightMove)
{
std::bitset<n> Result;
WhoRightMove >>=RightMoveBit;
Result=WhoRightMove;
return Result;
}
std::bitset<n> SaveRightMoveOutBIt
(int RightMoveBit,std::bitset<n> WhoRightMove,
int SavedNumber,std::bitset<n> HasSavedBit)
{
std::bitset<n> Result;
int i=0;
if(SavedNumber>0)
{
for(i=0;i<RightMoveBit;i++)
{
Result[i]=WhoRightMove[i];
}
Result <<=SavedNumber;
for(i=0;i<SavedNumber;i++)
{
Result[i]=HasSavedBit[i];
}
}else
{
for(i=0;i<RightMoveBit;i++)
{
Result[i]=WhoRightMove[i];
}
}
return Result;
}
std::bitset<n> Invert
(int BitNumber,std::bitset<n> WhoInvert,bool JiaYi)
{
std::bitset<n> Result;
std::bitset<n> yihuo;
int i=0,j=0;
bool HasAdd=false;
bool Over=false;
for(int i=0;i<BitNumber;i++)
{
yihuo.set(i);
}
std::cout<<"WhoInvert:\t\t\t"<<WhoInvert<<"\n";
std::cout<<"yihuo:\t\t\t\t"<<yihuo<<"\n";
WhoInvert=WhoInvert^yihuo;
std::cout<<"WhoInvert:\t\t\t"<<WhoInvert<<"\n";
if(JiaYi)
{
HasAdd=false;
Over=false;
i=0;
j=0;
while(i<WhoInvert.size())
{
if(!HasAdd)
{
if(WhoInvert.test(i))
{
WhoInvert.set(i,0);
HasAdd=true;
i++;
continue;
}else
{
WhoInvert.set(i);
HasAdd=false;
i++;
break;
}
}else
{
if(WhoInvert.test(i))
{
WhoInvert.set(i,0);
HasAdd=true;
i++;
if(i>=WhoInvert.size())
Over=true;
continue;
}else
{
WhoInvert.set(i);
HasAdd=false;
i++;
break;
}
}
}
if(Over)
std::cout<<"yichu\n";
}
Result=WhoInvert;
return Result;
}
std::bitset<n> AddTogether
(int Count,std::bitset<n> GetOne,std::bitset<n> GetSecond)
{
bool HasAdd=false;
bool Over=false;
int i=0;
int j=0;
std::bitset<n> Result;
while(i<Count)
{
if(!HasAdd)
{
if(GetSecond.test(i)&&GetOne.test(i))
{
Result.set(i,0);
HasAdd=true;
i++;
continue;
}else if(!GetSecond.test(i)&&!GetOne.test(i))
{
Result.set(i,0);
HasAdd=false;
i++;
continue;
}else
{
Result.set(i);
HasAdd=false;
i++;
continue;
}
}else
{
if(GetSecond.test(i)&&GetOne.test(i))
{
Result.set(i);
HasAdd=true;
i++;
if(i>=GetSecond.size())
Over=true;
continue;
}else if(!GetSecond.test(i)&&!GetOne.test(i))
{
Result.set(i);
HasAdd=false;
i++;
continue;
}else
{
Result.set(i,0);
HasAdd=true;
i++;
if(i>=GetSecond.size())
Over=true;
continue;
}
}
}
if(Over)
std::cout<<"yichu\n";
return Result;
}
std::bitset<n> SubOne
(int Count,std::bitset<n> Source)
{
std::bitset<n> Result=Source;
bool JieWei=false;
bool Over=false;
int i=0;
while(i<Count)
{
if(!JieWei)
{
if(Result.test(i))
{
Result.set(i,0);
JieWei=false;
i++;
break;
}else
{
Result.set(i,1);
JieWei=true;
i++;
continue;
}
}else
{
if(Result.test(i))
{
Result.set(i,0);
JieWei=false;
i++;
break;
}else
{
Result.set(i,1);
JieWei=true;
i++;
if(i>=Count)
Over=true;
continue;
}
}
}
if(Over)
std::cout<<"jie wei jie chu jie le\n";
return Result;
}
std::bitset<n>
AddOne(int Count,std::bitset<n> Source)
{
std::bitset<n> Result=Source;
bool HasAdd=false;
bool Over=false;
int i=0;
while(i<Count)
{
if(!HasAdd)
{
if(Result.test(i))
{
Result.set(i,0);
HasAdd=true;
i++;
continue;
}else
{
Result.set(i,1);
HasAdd=false;
i++;
break;
}
}else
{
if(Result.test(i))
{
Result.set(i,0);
HasAdd=true;
i++;
if(i>=Count)
Over=true;
continue;
}else
{
Result.set(i,1);
HasAdd=false;
i++;
break;
}
}
}
if(Over)
std::cout<<"jing wei jie chu jie le\n";
return Result;
}
int main ()
{
std::string strj1;
std::string strj2;
std::string strw1;
std::string strw2;
std::bitset<n> b_j1;
std::bitset<n> b_j2;
std::bitset<n> b_QiuFu_j2;
std::bitset<n> b_QiuFu_w2;
std::bitset<n> b_w1;
std::bitset<n> b_w2;
std::bitset<n> b_Save_Outw;
std::bitset<n> b_Temp_j;
std::bitset<n> b_Temp_w;
std::bitset<n> b_Result_j;
std::bitset<n> b_One;
int i,j;
int jCout=0;
int wCount=0;
int RightMoveWhichWei=2;
int RightMoveBit=0;
b_One.set(0);
std::cout<<"qin shu ru deng chang de bu ma zuo wei jie ma\n";
std::cin>>strj1;
std::cin>>strj2;
b_j1=std::bitset<n>(strj1);
b_j2=std::bitset<n>(strj2);
jCout=strj1.size();
if(b_j1.any()&&b_j2.any())
std::cout<<"b_j1 any && b_j2 any\n";
b_QiuFu_j2=Invert(jCout,b_j2,true);
std::cout<<"b_QiuFu_j2:\t\t\t"<<b_QiuFu_j2<<"\n";
std::cout<<"b_j1:\t\t\t\t"<<b_j1<<"\n";
b_Temp_j=AddTogether(jCout,b_j1,b_QiuFu_j2);
std::cout<<"b_Temp_j:\t\t\t"<<b_Temp_j<<"\n";
if(b_Temp_j.test(jCout-1)&&b_Temp_j.test(jCout-2))
std::cout<<"mei you yi chu\n";
else if (!b_Temp_j.test(jCout-1)&&!b_Temp_j.test(jCout-2))
std::cout<<"mei you yi chu\n";
else
{
std::cout<<"yi chu le\n";
getch();
getch();
return 0;
}
if(b_Temp_j.test(jCout-1)&&b_Temp_j.test(jCout-2))
{
b_Temp_j[jCout-1]=0;
b_Temp_j[jCout-2]=0;
b_Temp_j=SubOne(jCout,b_Temp_j);
b_Temp_j=Invert(jCout-2,b_Temp_j,false);
RightMoveWhichWei=0;
}else if(!b_Temp_j.test(jCout-1)&&!b_Temp_j.test(jCout-2)&&b_Temp_j.to_ulong())
{
RightMoveWhichWei=1;
}
std::cout<<"b_Temp_j:\t\t\t"<<b_Temp_j<<"\n";
RightMoveBit=b_Temp_j.to_ulong();
std::cout<<"RightMoveBit:\t\t\t"<<RightMoveBit<<"\n";
std::cout<<"qin shu ru deng chang de bu ma zuo wei Wei shu\n";
std::cin>>strw1;
std::cin>>strw2;
b_w1=std::bitset<n>(strw1);
b_w2=std::bitset<n>(strw2);
wCount=strw1.size();
std::cout<<"\nwCount\t\t\t"<<wCount<<"\n";
if(0==RightMoveWhichWei)
{
for(i=0;i<RightMoveBit;i++)
{
std::cout<<"\nb_Onej1 fin\t\t"<<b_j1<<"\n";
b_j1=AddTogether(jCout,b_j1,b_One);
std::cout<<"\nb_Onej1 fout\t\t"<<b_j1<<"\n";
}
std::cout<<"\nb_Onej1\t\t"<<b_j1<<"\n";
b_Result_j=b_j1;
b_Save_Outw=SaveRightMoveOutBIt(RightMoveBit,b_w1,0,NULL);
b_w1=RightMove(RightMoveBit,b_w1);
std::cout<<"\nb_Save_Outw\t\t"<<b_Save_Outw<<"\n";
std::cout<<"b_w1\t\t\t"<<b_w1<<"\n";
std::cout<<"b_w2\t\t\t"<<b_w2<<"\n";
}else if(1==RightMoveWhichWei)
{
for(i=0;i<RightMoveBit;i++)
{
std::cout<<"\nb_Onej2 fin\t\t"<<b_j2<<"\n";
b_j2=AddTogether(jCout,b_j2,b_One);
std::cout<<"\nb_Onej2 fout\t\t"<<b_j2<<"\n";
}
std::cout<<"\nb_Onej2\t\t\t"<<b_j2<<"\n";
b_Result_j=b_j2;
b_Save_Outw=SaveRightMoveOutBIt(RightMoveBit,b_w2,0,NULL);
b_w2=RightMove(RightMoveBit,b_w2);
std::cout<<"\n2b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
std::cout<<"2b_w1\t\t\t"<<b_w1<<"\n";
std::cout<<"2b_w2\t\t\t"<<b_w2<<"\n";
}else if(2==RightMoveWhichWei)
{
b_Result_j=b_j1;
}
# if 1
b_Temp_w=AddTogether(wCount,b_w1,b_w2);
std::cout<<"b_Temp_w\t\t"<<b_Temp_w<<"\n";
#endif
# if 0
if(1==RightMoveWhichWei)
b_QiuFu_w2=Invert(wCount-RightMoveBit,b_w2,true);
else
b_QiuFu_w2=Invert(wCount,b_w2,true);
std::cout<<"b_QiuFu_w2\t\t"<<b_QiuFu_w2<<"\n";
std::cout<<"b_w1\t\t\t"<<b_w1<<"\n";
b_Temp_w=AddTogether(wCount,b_w1,b_QiuFu_w2);
std::cout<<"b_Temp_w\t\t"<<b_Temp_w<<"\n";
#endif
i=wCount;
j=RightMoveBit;
while(b_Temp_w[i-1]==b_Temp_w[i-3]&&b_Temp_w[i-1]==b_Temp_w[i-2])
{
b_Temp_w[i-1]=0;
b_Temp_w <<= 1;
b_Result_j=SubOne(jCout,b_Result_j);
std::cout<<"zuo gui b_Result_j\t\t"<<b_Result_j<<"\n";
if(j>=0)
{
b_Temp_w[0]=b_Save_Outw[j-1];
b_Save_Outw[j-1]=0;
b_Save_Outw <<=1;
std::cout<<"zuo gui b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
j--;
}
std::cout<<"zuo gui b_Temp_w\t\t"<<b_Temp_w<<"\n";
}
i=wCount;
while(b_Temp_w[i-1]!=b_Temp_w[i-2])
{
b_Save_Outw=SaveRightMoveOutBIt(1,b_Temp_w,RightMoveBit,b_Save_Outw);
RightMoveBit++;
b_Temp_w >>= 1;
std::cout<<"you gui b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
std::cout<<"you gui b_Temp_w\t\t"<<b_Temp_w<<"\n";
b_Result_j=AddOne(jCout,b_Result_j);
std::cout<<"you gui b_Result_j\t\t"<<b_Result_j<<"\n";
}
std::cout<<"\n\nshe rv chu li\t\t\n";
if(RightMoveBit!=0)
if(b_Save_Outw.test(RightMoveBit-1))
b_Temp_w=AddOne(wCount,b_Temp_w);
std::cout<<"b_Temp_w\t\t"<<b_Temp_w<<"\n";
i=wCount;
j=RightMoveBit;
while(b_Temp_w[i-1]==b_Temp_w[i-3]&&b_Temp_w[i-1]==b_Temp_w[i-2])
{
b_Temp_w[i-1]=0;
b_Temp_w <<= 1;
b_Result_j=SubOne(jCout,b_Result_j);
std::cout<<"zuo gui b_Result_j\t\t"<<b_Result_j<<"\n";
if(j>=0)
{
b_Temp_w[0]=b_Save_Outw[j-1];
b_Save_Outw[j-1]=0;
b_Save_Outw <<=1;
std::cout<<"zuo gui b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
j--;
}
std::cout<<"zuo gui b_Temp_w\t\t"<<b_Temp_w<<"\n";
}
i=wCount;
while(b_Temp_w[i-1]!=b_Temp_w[i-2])
{
b_Save_Outw=SaveRightMoveOutBIt(1,b_Temp_w,RightMoveBit,b_Save_Outw);
RightMoveBit++;
b_Temp_w >>= 1;
std::cout<<"you gui b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
std::cout<<"you gui b_Temp_w\t\t"<<b_Temp_w<<"\n";
b_Result_j=AddOne(jCout,b_Result_j);
std::cout<<"you gui b_Result_j\t\t"<<b_Result_j<<"\n";
}
std::cout<<"\n\npang duan yi chu\t\t\n";
if((0==b_Result_j[jCout-1]&&0==b_Result_j[jCout-2])
||(1==b_Result_j[jCout-1]&&1==b_Result_j[jCout-2]))
{
std::cout<<"RightMoveBit\t\t"<<RightMoveBit<<"\n";
std::cout<<"b_Save_Outw\t\t"<<b_Save_Outw<<"\n";
std::cout<<"b_Temp_w\t\t"<<b_Temp_w<<"\n";
std::cout<<"b_Result_j\t\t"<<b_Result_j<<"\n";
}else if(0==b_Result_j[jCout-1]&&1==b_Result_j[jCout-2])
{
std::cout<<"上溢\t\t\n";
}else if(1==b_Result_j[jCout-1]&&0==b_Result_j[jCout-2])
{
b_Temp_w.reset();
b_Result_j.reset();
std::cout<<"b_Temp_w\t\t"<<b_Temp_w<<"\n";
std::cout<<"b_Result_j\t\t"<<b_Result_j<<"\n";
}
getch();
getch();
return 0;
}