改正:https:
#include
#include
#include
#include
#include
using namespace std;
const int n=28;
std::bitset RightMove
(int RightMoveBit,std::bitset WhoRightMove)
{
std::bitset Result;
WhoRightMove >>=RightMoveBit;
Result=WhoRightMove;
return Result;
}
std::bitset SaveRightMoveOutBIt
(int RightMoveBit,std::bitset WhoRightMove,
int SavedNumber,std::bitset HasSavedBit)
{
std::bitset Result;
int i=0;
if(SavedNumber>0)
{
for(i=0;ifor(i=0;ielse
{
for(i=0;ireturn Result;
}
std::bitset Invert
(int BitNumber,std::bitset WhoInvert,bool JiaYi)
{
std::bitset Result;
std::bitset yihuo;
int i=0,j=0;
bool HasAdd=false;
bool Over=false;
for(int i=0;iset(i);
}
std::cout<<"WhoInvert:\t\t\t"<"\n";
std::cout<<"yihuo:\t\t\t\t"<"\n";
WhoInvert=WhoInvert^yihuo;
std::cout<<"WhoInvert:\t\t\t"<"\n";
if(JiaYi)
{
HasAdd=false;
Over=false;
i=0;
j=0;
while(iif(!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 AddTogether
(int Count,std::bitset GetOne,std::bitset GetSecond)
{
bool HasAdd=false;
bool Over=false;
int i=0;
int j=0;
std::bitset Result;
while(iif(!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 SubOne
(int Count,std::bitset Source)
{
std::bitset Result=Source;
bool JieWei=false;
bool Over=false;
int i=0;
while(iif(!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
AddOne(int Count,std::bitset Source)
{
std::bitset Result=Source;
bool HasAdd=false;
bool Over=false;
int i=0;
while(iif(!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 b_j1;
std::bitset b_j2;
std::bitset b_QiuFu_j2;
std::bitset b_QiuFu_w2;
std::bitset b_w1;
std::bitset b_w2;
std::bitset b_Save_Outw;
std::bitset b_Temp_j;
std::bitset b_Temp_w;
std::bitset b_Result_j;
std::bitset 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(strj1);
b_j2=std::bitset(strj2);
jCout=strj1.size();
;
std::cout<<"b_j1:\t\t\t\t"<"\n";
b_Temp_j=AddTogether(jCout,b_j1,b_QiuFu_j2);
std::cout<<"b_Temp_j:\t\t\t"<"\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"<"\n";
RightMoveBit=b_Temp_j.to_ulong();
std::cout<<"RightMoveBit:\t\t\t"<"\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(strw1);
b_w2=std::bitset(strw2);
wCount=strw1.size();
std::cout<<"\nwCount\t\t\t"<"\n";
if(0==RightMoveWhichWei)
{
for(i=0;istd::cout<<"\nb_Onej1 fin\t\t"<"\n";
b_j1=AddTogether(jCout,b_j1,b_One);
std::cout<<"\nb_Onej1 fout\t\t"<"\n";
}
std::cout<<"\nb_Onej1\t\t"<"\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"<"\n";
std::cout<<"b_w1\t\t\t"<"\n";
std::cout<<"b_w2\t\t\t"<"\n";
}else if(1==RightMoveWhichWei)
{
for(i=0;istd::cout<<"\nb_Onej2 fin\t\t"<"\n";
b_j2=AddTogether(jCout,b_j2,b_One);
std::cout<<"\nb_Onej2 fout\t\t"<"\n";
}
std::cout<<"\nb_Onej2\t\t\t"<"\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"<"\n";
std::cout<<"2b_w1\t\t\t"<"\n";
std::cout<<"2b_w2\t\t\t"<"\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"<"\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"<"\n";
std::cout<<"b_w1\t\t\t"<"\n";
b_Temp_w=AddTogether(wCount,b_w1,b_QiuFu_w2);
std::cout<<"b_Temp_w\t\t"<"\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"<"\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"<"\n";
j--;
}
std::cout<<"zuo gui b_Temp_w\t\t"<"\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"<"\n";
std::cout<<"you gui b_Temp_w\t\t"<"\n";
b_Result_j=AddOne(jCout,b_Result_j);
std::cout<<"you gui b_Result_j\t\t"<"\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"<"\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"<"\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"<"\n";
j--;
}
std::cout<<"zuo gui b_Temp_w\t\t"<"\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"<"\n";
std::cout<<"you gui b_Temp_w\t\t"<"\n";
b_Result_j=AddOne(jCout,b_Result_j);
std::cout<<"you gui b_Result_j\t\t"<"\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"<"\n";
std::cout<<"b_Save_Outw\t\t"<"\n";
std::cout<<"b_Temp_w\t\t"<"\n";
std::cout<<"b_Result_j\t\t"<"\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"<"\n";
std::cout<<"b_Result_j\t\t"<"\n";
}
getch();
getch();
return 0;
}