二进制加法

二进制加法实现及转换
该博客介绍了一个计算两个正整数二进制加法的问题,通过将输入的十进制数转换为二进制,按照二进制加法规则进行运算,并将结果转换回十进制输出。解决方案涉及在数组中处理二进制位,处理不同长度的二进制数,以及使用C语言的库函数完成十进制转换。

题目: 输入两个正整数X,Y,将X,Y化为二进制数,然后将这两个二进制数作二进制加法运算,再将结化为十进制数输出。 
(二进制加法规则:0+0=0    0+1=1    1+0=1    1+1=10 )

提示:在数组里运算。

思路:先将输入的数转成二进制,此时数是倒着排的即二进制的最低位在x[0],我们打印的时候把它正过来;做加法时模拟二进制加法规则,再考虑进位,这里我用的while循环,循环退出的条件是两个数都加完且最高位无进位。如果有一个数位数较少先加完了,那么我们把这个数高位补0。最后化成10进制时用的pow函数是C语言的库函数,你们自己查一下。

#include  < iostream >
#include 
< cmath >
using   namespace  std;
int  Convert( long , char * );
void  Display( char * , int );
int  Plus( char * , int , char * , int , char * );
long  ToDecimal( char * , int );

int  main()
{
    
long  x,y;
    cout
<< " Input the first number: " ;
    cin
>> x;
    cout
<< " Input the second number: " ;
    cin
>> y;
    
char  xbin[ 50 ],ybin[ 50 ];
    
int  xbin_len,ybin_len;
    xbin_len
= Convert(x,xbin);
    ybin_len
= Convert(y,ybin);
    Display(xbin,xbin_len);
    Display(ybin,ybin_len);

    
char  result[ 50 ];
    
int  result_len = Plus(xbin,xbin_len,ybin,ybin_len,result);
    Display(result,result_len);
    
long  answer = ToDecimal(result,result_len);
    cout
<< " The answer is  " << answer << endl;
}

int  Convert( long  x, char *  a)
{
    
int  i = 0 ;
    
while ( ! (x < 2 ))
    {
          
int  residual = x % 2 ;
         a[i]
= residual + 48 ;
          i
++ ;
          x
= x / 2 ;
     }
     a[i]
= x + 48 ;
     
return  i + 1 ;
}

void  Display( char *  a, int  len)
{
    
for ( int  i = len - 1 ;i >= 0 ;i -- )
        cout
<< a[i];
    cout
<< endl;
}

int  Plus( char *  x, int  xlen, char *  y, int  ylen, char *  result)
{
    
int  i = 0 ,jw = 0 ;
    
bool  flag = 3 ;
    
do
    {
        
if (i >= xlen)
            x[i]
= 48 ;
        
if (i >= ylen)
            y[i]
= 48 ;
        
if (flag = (i >= xlen) && (i >= ylen) && (jw == 0 ))
            
break ;
        
int  bw = x[i] - 48 + y[i] - 48 + jw;
        
switch (bw)
        {
            
case   0 :
                jw
= 0 ;
                
break ;
            
case   1 :
                jw
= 0 ;
                
break ;
            
case   2 :
                bw
= 0 ;
                jw
= 1 ;
                
break ;
            
case   3 :
                bw
= 1 ;
                jw
= 1 ;
                
break ;
        }
        result[i]
= bw + 48 ;
        i
++ ;
    }
while ( 1 );
    
return  i;
}

long  ToDecimal( char *  a, int  len)
{
    
long  d = 0 ;
    
for ( int  i = 0 ;i < len;i ++ )
        d
+= (a[i] - 48 ) * ( int )pow( 2.0 ,i);
    
return  d;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值