【问题标题】:Binary Set Calculator Function二进制集计算器功能
【发布时间】:2014-12-25 06:38:18
【问题描述】:

所以我一直在为我的 C++ 课程做一个项目,我们必须创建一个二进制计算器。然而,教授说这些函数应该返回一个 8 位二进制集。我的问题是这个

11111111 + 11111111 = 0111111110

然而在我们最初创建的函数中,这就是结果

11111111 + 1111111 = 00000000

这对我来说是不正确的。所以我把我的功能改成了这个

十进制转二进制

string DecToBin(int num)
{
  /*
        Purpose: Changing a Decimal to a Binary Set
        Pre: Valid positive integer
        Post: Returns the valid binary string
  */
  string bin = "";
  while (num >= 0)
  {
     bin += (num % 2 == 0 ? "0" : "1");
     if (num != 0)
         num /= 2;
     else break;
  }
 return bin;
}

虽然问题又来了

01010101 + 10101010 = 011111111

但我上面的函数返回

01010101 + 10101010 = 111111110

如果我需要返回一个 8 位集合,或者如果像我上面所说的函数一样,它为某些返回正确答案,而为其他返回错误,我需要弄清楚为什么会这样首先。

二进制转十进制

int BinToDec(string bin)
{
  /*
     Purpose: To generate a decimal integer from a string binary set
     Pre: Valid String binary set
     Post: Output the output decimal integer
  */
  int output = 0; //initialize output as 0
  int base2Start = 128;//base2 start at 128
  int len = bin.length();//get the string length
   for (int i = 0; i < len; i++)//iterate
   {
     if (bin[i] == '1')//if bin[i] in the array of string is a char 1
     {
         output = output + base2Start;//output gets + base2Start 
     }//end if condition
     base2Start = base2Start / 2;//divide base2Start after each iteration
   }//end for loop
    return output;//return the output
}

加法函数

 int Addition(string st1, string st2)
  {    
    /*
       Purpose: Get's two valid Binary sets, then adds their decimal conversion, and returns the addition
       Pre: Need two strings that SHOULD be valid binary
       Post: Returns binary from decimal conversion
    */
    int first, second;

    if (ValidBin(st1))
    {
       first = BinToDec(st1);
    }
    else return 0;

    if (ValidBin(st2)){
       second = BinToDec(st2);
    }
    else return 0;

    add++;
    return first + second;
  }

【问题讨论】:

  • 你做二进制或运算的代码在哪里?另外,您不认为您的 bin 应该反向以获得十进制数的正确二进制表示吗?
  • 更新了更多的表现形式和其他功能

标签: c++ binary


【解决方案1】:
bin += (num % 2 == 0 ? "0" : "1");

应该是

bin = (num % 2 == 0 ? "0" : "1") + bin;

因为您每次都将num 的最低有效位添加到字符串中。所以最后,根据您的代码,您将拥有最不重要的最左边而不是最右边。

编辑:为了将结果截断为 8 位宽度,请更改以下行:

return first + second;

通过这个:

return (first + second) & 0xFF; // Same as (first + second) % 256

【讨论】:

  • 这没有回答我的问题,我应该使用 8 位转换功能还是应该坚持我的枪在这里发回 10 位集?我不完全理解二进制,所以我不能真正站在立场上和我的教授就这个问题争论。
  • 如果我理解正确,您的教授要求返回 8 位结果。因此,您需要将结果截断为 8 个最低有效位。您没有在此处发布实际执行计算的代码,因此我无法准确指出应该更改哪些内容以实现此目的。
  • @EasyBB 查看我编辑的答案 - 您可以使用 (first + second) &amp; 255(first + second) % 256 将结果截断为 8 位
【解决方案2】:
#include <iostream>
 using namespace std;

 string sumBinary (string s1, string s2);

 int main() 
 {

    cout << "output = "<<  sumBinary ("10","10");
 }

string sumBinary (string s1, string s2)
{

if (s1.empty())
    return s2;
if (s2.empty())
    return s1;

int len1 = s1.length() -1;
int len2 = s2.length() -1;

string s3;

s3 = len1 > len2 ? s1: s2;

int len3 = s3.length() -1;

bool carry = false;

while (len1>=0 || len2>=0) {

    int i1 = len1>=0? s1[len1--] - '0': 0;
    int i2 = len2>=0? s2[len2--] - '0': 0;

    // Check if any invalid character
    if (i1 <0 || i1>1 || i2<0 || i2>1)
        return "";

    // 3 bit sum            
    int sum = i1 ^ i2 ^ carry;

    // 3 bit carry
    carry = (i1 & carry) | (i2 & carry) | (i1 & i2);

    s3[len3--] = '0' + sum;

    }


if (carry)
    s3 = "1" + s3;

return s3;
}

【讨论】:

  • 你能解释一下你的答案吗?
  • 感谢您的回复
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 2021-11-30
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2013-07-08
  • 2021-03-02
相关资源
最近更新 更多