计算两个二进制数的和。

从键盘接收两个二进制数,(请考虑到用户可能会输入非0和1的数,),以二进制和十进制形式输出它们的和.


#include <iostream>
#include <string>
#include<cstdio>
#include<cmath>
using namespace std;
int RecInput(char str[],const int &MaxLen); //从键盘接收输入 
int BinToDec(char str[],const int &length); 
void DecToBin(int num); 
int main()
{
    const int MaxLen=50;
    char BinNum1[MaxLen],BinNum2[MaxLen];
    int Num1Len,Num2Len;  //实际接收的位数
    Num1Len=RecInput(BinNum1,MaxLen);
    cout<<endl;
    Num2Len=RecInput(BinNum2,MaxLen);
    int total=0;
    total+=BinToDec(BinNum1,Num1Len);
    total+=BinToDec(BinNum2,Num2Len);
    cout<<"\nThe results is (Binary): "<<endl;
    DecToBin(total);
    cout<<"That is (Decimalism) : "<<total<<endl;
    return 0;
}
int RecInput(char str[],const int &MaxLen)
{
    int length=0;
    cout<<"Please input a binary number:\n";
    for(;length<MaxLen-1;length++)
    {
        cin.get(str[length]);
        if(str[length]=='0'||str[length]=='1')
            continue;
        else if(str[length]!='\n')
        {
            int c;
            while((c = getchar()) != '\n');
        }
        break;
    }
    str[length]='\0';
    cout<<"You have input:"<<str<<endl;
    return length;
}
int BinToDec(char str[],const int &length)
{
    int sum=0;
    for(int i=0;i<length;i++)
        sum=sum*2+(int)(str[i]-48);
    return sum;
}
void DecToBin(int num)
{
    int Length=(int)(log(num)/log(2))+1, //二进制的位数
        FetchBit=pow(2,Length-1);  //取位
    for(int i=0;i<Length;i++)
    {
        //从高到底每次取一位
        int tmp=num&FetchBit;
        if(tmp==0)
            cout<<0;
        else
            cout<<1;
        FetchBit>>=1;
    }
    cout<<endl;
}



    在RecInput()上犹豫了很久,主要是要考虑到用户可能会输入除了1和0之外的数,所以要先接收该字符再进行判断,当接收到这些数时,就只读入之前的0或1的数(例如输入了1010102345,则只接收101010),然后要刷新缓冲区(int c; while((c = getchar()) !='\n');)以供下次接收新的输入。这时问题就来了,刷新缓冲区是以回车符作为结束标志位的,但是假如用户输入的都是正常的1或0,那么回车符就会被提前接收,那么刷新缓冲区就会变成等待键盘输入,这样导致了用户输入的第二个二进制数被刷新掉了。不过最后还是解决了。

    然后这里十进制转换为二进制的算法不是用辗除法,而是用位运算,从高到低,每次取一位输出。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值