У меня стоит такая задача: написать программу для выполнения операций с двоичными числами. Объясните, пожалуйста, как можно проще реализовать эту программу.
То есть я должен ввести 2 числа в десятичной с/с перевести их в двоичную с/с и выбрать определенную операцию? Заранее спасибо! Нашел пример программы,но она работает некорректно.Помогите исправить.
Unit2.h
#ifndef Unit2H
#define Unit2H
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
char* Add(const char *,const char *,const int);
char* Sub(const char *,const char *,const int);
char* DecToBin(unsigned long int,const int);
long int BinToDec(const char *,const int);
char* Landslide(const char *,const int,const int);
char* Mult(const char *,const char *,const int);
char* Div(const char *,const char *,const int);
char* LonglongToBin(unsigned long int,unsigned long int,int &);
void BinToLonglong(unsigned long int &,unsigned long int &,const char *);
int IsEqual(const char *,const char *,const int);
char* LandslideExpand(const char *,const int,const int,const int);
void DoComplementaryCode(char *&,const int);
#endif
Unit2.cpp
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
char* Add(const char *a,const char *b,const int size)//a+b
{
int p=0,i;//p=1-если было переполнение, иначе 0
char *r=new char[size];
r[size]='\0';
for(i=size-1;i>=0;i--)
{
if(a[i]-'0'+b[i]-'0'+p<2)
{
r[i]='0'+a[i]-'0'+b[i]-'0'+p;
p=0;
}
else
{
r[i]='0'+a[i]-'0'+b[i]-'0'+p-2;
p=1;
}
}
return r;
}
char* Sub(const char *a,const char *b,const int size)// a-b
{
int i;
char *r=new char[size],
*_b=new char[size];
r[size]='\0';
for(i=0;i<size;i++)
{
r[i]='0';
_b[i]=1-(b[i]-'0')+'0';
}
r[i-1]='1';
_b[i]='\0';
return Add(a,Add(_b,r,size),size);
}
char* DecToBin(unsigned long int t,const int size)//long int переводим в двоичное число (строку)
{
char *r=new char[size];
int i;
for(i=size-1;i>=0;i--)
{
if((1<<i)<=t)
{
r[size-i-1]='1';
t=t-(1<<i);
}
else
{
r[size-i-1]='0';
}
}
r[size]='\0';
return r;
}
long int BinToDec(const char *a,const int size)//строку в число
{
unsigned long int l;
int i;
l=0;
for(i=0;i<size;i++)
{
l=l+(1<<(size-1-i))*(a[i]-'0');
}
return l;
}
char* Landslide(const char *a,const int size,const int n)//смещение числа на n разрядов влево
{
int i;
char *b=new char[size];
b[size]='\0';
for(i=0;i<size-n;i++)
{
b[i]=a[i+n];
}
for(;i<size;i++)
{
b[i]='0';
}
return b;
}
char* Mult(const char *a,const char *b,const int size)//a*b
{
int i;
char *r=new char[size];
r[size]='\0';
for(i=0;i<size;i++)
{
r[i]='0';
}
for(i=size-1;i>=0;i--)
{
if(b[i]=='1')
{
r=Add(r,Landslide(a,size,size-1-i),size);
}
}
return r;
}
char* LonglongToBin(unsigned long int a,unsigned long int b,int &size)//Longlong- то есть число с 64bit
{
int i;
char *r,*d;
size=sizeof(a)*16;
r=new char[size];
d=DecToBin(a,size/2);
for(i=0;i<size/2;i++)
{
r[i]=d[i];
}
d=DecToBin(b,size/2);
for(;i<size;i++)
{
r[i]=d[i-size/2];
}
r[i]='\0';
return r;
}
void BinToLonglong(unsigned long int &a,unsigned long int &b,const char *r)//наоборот, делаем с строки число 64bit
{
int size=sizeof(a)*8+sizeof(b)*8;
a=BinToDec(r,size/2);
b=BinToDec(&r[size/2],size/2);
}
char* Div(const char *_a,const char *_b,const int size)// a/b
{
char *a,*b,
*r=new char[size];
int i,ir,ind,
sizea,sizeb;
for(i=0;i<size;i++)
{
r[i]='0';
}
r[size]='\0';
i=0;
while( _a[i]=='0' )
{
i++;
}
sizea=size-i;
a=new char[sizea];
for(i=0;i<sizea;i++)
{
a[i]=_a[i+size-sizea];
}
a[i]='\0';
i=0;
while( _b[i]=='0' )
{
i++;
}
sizeb=size-i;
if( sizeb<=0 )
{
return NULL;
}
b=new char[sizeb];
for(i=0;i<sizea;i++)
{
b[i]=_b[i+size-sizeb];
}
b[i]='\0';
DoComplementaryCode(b,sizeb);
if( IsEqual(a,&_b[size-sizeb],sizeb)>=0 )
{
ir=size-sizea+sizeb-1;
}
else
{
ir=size-sizea+sizeb;
}
ind=0;
while( sizea>=sizeb )
{
if( ind==1 || IsEqual(a,&_b[size-sizeb],sizeb)>=0 )
{
r[ir]='1';
{
int p=0;
for(i=sizeb-1;i>=0;i--)
{
if(a[i]-'0'+b[i]-'0'+p<2)
{
a[i]='0'+a[i]-'0'+b[i]-'0'+p;
p=0;
}
else
{
a[i]='0'+a[i]-'0'+b[i]-'0'+p-2;
p=1;
}
}
}
if( ind==0 )
{
a++;
sizea--;
ir++;
}
else
{
ind=0;
ir++;
}
}
else
{
if( *a=='0' )
{
r[ir]='0';
a++;
sizea--;
}
else
{
a++;
sizea--;
ind=1;
}
}
}
return r;
}
int IsEqual(const char *a,const char *b,const int size) // =1, if a>b; =-1, if a<b; =0, if a=b;
{
int i;
for(i=0;i<size;i++)
{
if( a[i]!=b[i] )
{
return (a[i]-b[i]);
}
}
return 0;
}
char* LandslideExpand(const char *a,const int size,const int newsize,const int n)//смещение с возможностю увеличить разрядность результата
{
int i;
char *b=new char[newsize];
b[newsize]='\0';
for(i=0;i<newsize-size-n;i++)
{
b[i]='0';
}
for(;i<size-n;i++)
{
b[i]=a[i+n-newsize+size];
}
for(;i<newsize;i++)
{
b[i]='0';
}
return b;
}
void DoComplementaryCode(char *&a,const int size)//делаем допольняльной код
{
int i;
char *r,*b=new char[size];
for(i=0;i<size;i++)
{
a[i]=1-(a[i]-'0')+'0';
b[i]='0';
}
b[i]='\0';
b[i-1]='1';
r=a;
a=Add(a,b,size);
delete[] r;
delete[] b;
}
Unit1.cpp
#pragma hdrstop
#pragma argsused
#include "Unit2.h"
using namespace std;
int main(int argc, char* argv[])
{
char *a,*b,*r;
int size=8;
unsigned long m,n;
cout<<"a=";
cin>>m;
cout<<"b=";
cin>>n;
a=DecToBin(m,size);
b=DecToBin(n,size);
cout<<"a(2)="<<a<<"\nb(2)="<<b<<endl;
r=Div(a,b,size);
cout<<m<<"/"<<n<<"="<<BinToDec(r,size)<<endl;
cout<<"r=";
puts(r);
getch();
return 0;
}
int-ы. – Arhadthedev May 09 '16 at 14:20