【问题标题】:how can I implement adding "+1" step when calculating two's complement for a negative number在计算负数的二进制补码时如何实现添加“+1”步骤
【发布时间】:2018-03-08 04:54:00
【问题描述】:

该程序适用于任何给定长度的无符号整数,但对于负整数,如果整数为 -99 且长度为 8,则输出为 10011100,但正确答案为 10011101。所以,基本上,“+1”步骤不见了。如何在不添加新库或使用数组的情况下对其进行编码?

$

#include <iostream>
#include "math.h"
#include <string>
using namespace std;
// DONT MAKE ANY ADDITION
// DONT USE ANY ARRAY DATA TYPE

string decimalToTwoComplimentString(int a, int length)
{
    int bitSize=0;
    string binary, r_bin;

    for(int j=abs(a); j>=0; j/=2)
    {
        if(a>=0) // NO PROBLEM HERE
        {
            if(bitSize!=length)
            {
                if(j%2==0)
                    binary.append("0");
                else if(j%2==1)
                    binary.append("1");
                bitSize++;
            }
            else if(bitSize==length)
            {
                break;
            }
        }

        else if(a<0) // ADDING +1 AT THE END PART IS MISSING!
        {
            if(bitSize!=length)
            {
                if(j%2==0)
                    binary.append("1");
                else if(j%2==1)
                    binary.append("0");
                bitSize++;
            }
            else if(bitSize==length)
            {
                break;
            }
        }
    }

    for(int i=binary.length()-1; i>=0; i--) // PRINTING STRING BACKWARDS
    {
        r_bin+=binary.at(i);
    }
    return r_bin;
}

int main()
{
    int L;
    cout<< "Enter bit pattern size";
    cin>>L;

    int a, b;
    cout<<"Enter an integer a ";
    cin>>a;
    cout<<"Enter an integer b ";
    cin>>b;

    int c1 = a + b;
    cout<<"In decimal "<< a << " + " << b << " is " << c1 << endl;

    string A = decimalToTwoComplimentString(a, L);
    string B = decimalToTwoComplimentString(b, L);

    cout<< "The Two's complement of " << a << " is \t" << A << endl;
    cout<< "The Two's complement of " << b << " is \t" << B << endl;


    system("Pause");
    return 0;
}

【问题讨论】:

  • 您尝试了哪些方法,为什么无法弄清楚?只需将结果视为无符号整数并加 1。没有人说您必须将所有内容放在一个大循环中。不过,您的代码中有一些奇怪的逻辑,例如在循环内部而不是外部检查数字是否为负数,这会导致在每次迭代而不是仅在开始时进行检查。
  • 我不知道这里有什么问题。二进制补码(不是compliment)加减法与无符号版本完全相同,因此不需要单独的加法器

标签: c++ string twos-complement


【解决方案1】:

与其尝试通过不断除以 2 并检查您是偶数还是奇数来转换为字符串,不如简单地使用按位运算。如果你这样做了,你就不需要区分负值和正值,因为你一次只看一个位。您可以通过使用右移运算符&gt;&gt; 和位掩码来获得最低有效位来实现相同的目的。像这样的:

string decimalToTwoComplimentString(int a, int length)
{
    string binary;
    for (int i = 0; i < length; ++i)
    {
        if (a & 0x01)
        {
            binary.append("1");
        }
        else
        {
            binary.append("0");
        }
        a = a >> 1;
    }

    // ... and then reverse it
}

所以这里发生的是我们正在对输入值a 的位进行操作。逻辑 AND 运算符 (&amp;) 采用 2 个值并对它们进行按位与。这意味着它从左操作数中获取位 0,从右操作数中获取位 0,并询问它们是否都等于 1。如果是,则结果为 1,否则结果为 0。然后它做同样的事情对于第 1 位,然后是第 2 位等。当您有 a &amp; 0x01 时,第一个操作数是 a,第二个操作数是十六进制值 01,即 1。所以只设置了第 0 位。其他 32 位为 0。这意味着 &amp; 将为 1-31 位返回 0。但是对于第 0 位,结果将是 a 在第 0 位中的任何内容。

&gt;&gt; 运算符,然后将所有位 1 向右移动。最低位从末端掉下来,再也没有听到过。我们再次做同样的事情,直到我们到达第 32 位。

【讨论】:

  • 如果他只是在字符串前面而不是追加,他也可以跳过整个“反转它”循环。即:binary = std::string((a&amp;1) ? "1":"0") + binary;
  • 你能简单解释一下 (a & 0x01) 部分“0x01”的用途是什么?
  • 好点!我已经添加了解释。让我知道这是否有意义。
猜你喜欢
  • 2023-03-25
  • 2019-02-20
  • 2015-04-07
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2017-03-16
相关资源
最近更新 更多