C++ 函数输出到int数组

C++ 函数输出到int数组,c++,arrays,function,binary,C++,Arrays,Function,Binary,我正在开发一个程序,它从命令行读取两个十进制数,将它们转换为二进制,相加,然后输出二进制和十进制的总和 我制作了一个将十进制输入转换为二进制的函数,但现在我不知道如何将这些值转换为int数组 例如: 输入:./a.out 3 2 我的函数将3转换为11,将2转换为10 现在我需要把这些值放在一个int数组的末尾,所以看起来像这样:00000000000000000000000011和00000000000000000010 这样,我添加二进制数的逻辑就可以正常工作了 这是我的尝试,但它说它可以从

我正在开发一个程序,它从命令行读取两个十进制数,将它们转换为二进制,相加,然后输出二进制和十进制的总和

我制作了一个将十进制输入转换为二进制的函数,但现在我不知道如何将这些值转换为int数组

例如: 输入:./a.out 3 2

我的函数将3转换为11,将2转换为10

现在我需要把这些值放在一个int数组的末尾,所以看起来像这样:00000000000000000000000011和00000000000000000010

这样,我添加二进制数的逻辑就可以正常工作了

这是我的尝试,但它说它可以从void分配int:

#include <iostream>
#include <cstdlib>
#include <string.h>

using namespace std;

void binary(int);

int main(int argc, char* argv[])
{
    if(argc != 3)
    {
        cerr << "Invalid number of operands" << endl;
        return 1;
    }
    int i;
    int arg1 = atoi(argv[1]);
    int arg2 = atoi(argv[2]);
    int sum = arg1 + arg2;
    int a[32];
    int b[32];
    int c[32];
    int carry = 0;
    bool print = false;

    for(i = 0; i < 32; i++)
    {
        a[i] = 0;
        b[i] = 0;
        c[i] = 0;
    }
    for(i = 31; i >= 0; i--)
    {
        a[i] = binary(arg1); //PROBLEM AREA
        b[i] = binary(arg2); //PROBLEM AREA
    }
    for(i = 31; i >= 0; i--)
    {
        if (a[i] == 1 && b[i] == 1 && carry == 0)
        {
            c[i] = 0;
            carry = 1;
        }
        else if (a[i] == 1 && b[i] == 0 && carry == 0)
        {
            c[i] = 1;
            carry = 0;
        }
        else if (a[i] == 0 && b[i] == 0 && carry == 0)
        {
            c[i] = 0;
            carry = 0;
        }
        else if (a[i] == 0 && b[i] == 1 && carry == 0)
        {
            c[i] = 1;
            carry = 0;
        }
        else if (a[i] == 1 && b[i] == 1 && carry == 1)
        {
            c[i] = 1;
            carry = 1;
        }
        else if (a[i] == 1 && b[i] == 0 && carry == 1)
        {
            c[i] = 0;
            carry = 1;
        }
        else if (a[i] == 0 && b[i] == 0 && carry == 1)
        {
            c[i] = 1;
            carry = 0;
        }
        else if (a[i] == 0 && b[i] == 1 && carry == 1)
        {
            c[i] = 0;
            carry = 1;
        }
    }
    if(carry == '1')
        cout << carry;
    for (i = 0; i < 32; i++) 
    {
        if (c[i] == 1) 
            print = true;
        if (print) 
            cout << c[i];
    }   
    cout <<  " = " << sum;
    cout << endl;
    return 0;
}

void binary(int number)
{
    int remainder;
    if(number <= 1) 
    {
        cout << number;
        return;
    }
    remainder = number % 2;
    binary(number >> 1);    
    cout << remainder;
}

任何想法或建议将不胜感激

既然输入是十进制的,为什么要添加两个二进制小数?将每个数字显示为二进制数字会更简单,但使用十进制值进行加法,然后以二进制表示显示结果

编辑:好的,一开始我没有看到你的家庭作业标签

二进制函数可以返回int向量,在二进制函数中创建向量并返回它。e、 g

vector<int> binary(int n);

既然输入是十进制的,为什么要添加两个二进制小数?将每个数字显示为二进制数字会更简单,但使用十进制值进行加法,然后以二进制表示显示结果

编辑:好的,一开始我没有看到你的家庭作业标签

二进制函数可以返回int向量,在二进制函数中创建向量并返回它。e、 g

vector<int> binary(int n);
a[i]=二进制arg1//问题领域

二进制方法是一种无效方法。您应该从中返回一个int值,以便能够将其分配给[i]。

a[i]=binaryarg1//问题领域

二进制方法是一种无效方法。您应该从中返回一个int值,以便能够将其分配给[i]。

此处:

cout << remainder;
不要忘记将void二进制数更改为int二进制数。

此处:

cout << remainder;

不要忘记将void二进制数更改为int二进制数。

只需使用位操作即可

#include <iostream>
#include <climits>

template <typename T>
char *to_binary_string(const T &n, char *out) {
   char *p = out;

   if (out) {
      for (int i = sizeof(T) * CHAR_BIT - 1; i >= 0; --i)
         *p++ = ((n & (1 << i)) >> i) + '0';
      *p = 0;
   }

   return out;
}

int main() {
   char buf[33] = "";
   int test[] = { 0xF, 0x2, 0x3, 0xFF, 0x15 };
   for (int i = 0; i < sizeof(test)/sizeof(*test); ++i) {
      std::cout << to_binary_string<int>(test[i], buf) << std::endl;
   }

   return 0;
}

只需使用位操作

#include <iostream>
#include <climits>

template <typename T>
char *to_binary_string(const T &n, char *out) {
   char *p = out;

   if (out) {
      for (int i = sizeof(T) * CHAR_BIT - 1; i >= 0; --i)
         *p++ = ((n & (1 << i)) >> i) + '0';
      *p = 0;
   }

   return out;
}

int main() {
   char buf[33] = "";
   int test[] = { 0xF, 0x2, 0x3, 0xFF, 0x15 };
   for (int i = 0; i < sizeof(test)/sizeof(*test); ++i) {
      std::cout << to_binary_string<int>(test[i], buf) << std::endl;
   }

   return 0;
}

。。。或者,我相信,您可以使用更高效的内联汇编函数,而不是位运算符功能有限的混乱局面;没有优化,但这样就100%清楚了

void binary(long int var_in, char* var_out)
{
 __asm
 {
  MOV   ESI, var_in
  MOV   EDI, var_out
  ADD   EDI, 0x1F
  XOR   EBX, EBX
  DEC   EBX
  NOT   EBX
@loop1_start:
  NOT   EBX
  INC   EBX
  CMP   EBX, 0x1F
  JG    @loop1_end
  BT    ESI, EBX
  JC    @loop1_set1
  MOV   AL, 0x30
  JMP   @loop1_set0
@loop1_set1:
  MOV   AL, 0x31
@loop1_set0:
  NOT   EBX
  MOV   BYTE PTR DS:[EDI+EBX], AL
  JMP   @loop1_start
@loop1_end:
  MOV   BYTE PTR DS:[EDI+1], 0x00
 }
}
其中,var_in是一个32位整数,var_out是一个至少包含33个元素32字节+“\0”的字符数组


注:你的“二进制”是递归的。众所周知,如果可能的话,使用递归函数而不是迭代函数会产生慢得多的结果。。。或者,我相信,您可以使用更高效的内联汇编函数,而不是位运算符功能有限的混乱局面;没有优化,但这样就100%清楚了

void binary(long int var_in, char* var_out)
{
 __asm
 {
  MOV   ESI, var_in
  MOV   EDI, var_out
  ADD   EDI, 0x1F
  XOR   EBX, EBX
  DEC   EBX
  NOT   EBX
@loop1_start:
  NOT   EBX
  INC   EBX
  CMP   EBX, 0x1F
  JG    @loop1_end
  BT    ESI, EBX
  JC    @loop1_set1
  MOV   AL, 0x30
  JMP   @loop1_set0
@loop1_set1:
  MOV   AL, 0x31
@loop1_set0:
  NOT   EBX
  MOV   BYTE PTR DS:[EDI+EBX], AL
  JMP   @loop1_start
@loop1_end:
  MOV   BYTE PTR DS:[EDI+1], 0x00
 }
}
其中,var_in是一个32位整数,var_out是一个至少包含33个元素32字节+“\0”的字符数组


注:你的“二进制”是递归的。众所周知,如果可能的话,使用递归函数而不是带有迭代的函数会产生慢得多的结果。

原因是您将二进制文件写入输出,而不是写入数组。您应该做的是,将数组发送到您的函数并让它填充它

例如,假设函数如下所示:

void to_binary(int number, int *array, int position_to_fill);
然后,您可以做的是,与您编写的完全相同,但不是cout,而是在适当的位置写入数组:

void to_binary(int number, int *array, int position_to_fill)
{
    int remainder;
    if (position_to_fill < 0) // shouldn't really happen
        return;
    if (number <= 1)
    {
        array[position_to_fill] = number;
        return;
    }
    remainder = number % 2;
    binary(number >> 1, array, position_to_fill-1);
    array[position_to_fill] = number;
}
你写

to_binary(arg1, a, 31);
to_binary(arg2, b, 31);

原因是您正在将二进制文件写入输出,而不是在数组中。您应该做的是,将数组发送到您的函数并让它填充它

例如,假设函数如下所示:

void to_binary(int number, int *array, int position_to_fill);
然后,您可以做的是,与您编写的完全相同,但不是cout,而是在适当的位置写入数组:

void to_binary(int number, int *array, int position_to_fill)
{
    int remainder;
    if (position_to_fill < 0) // shouldn't really happen
        return;
    if (number <= 1)
    {
        array[position_to_fill] = number;
        return;
    }
    remainder = number % 2;
    binary(number >> 1, array, position_to_fill-1);
    array[position_to_fill] = number;
}
你写

to_binary(arg1, a, 31);
to_binary(arg2, b, 31);

无效二元体;返回一个void,那么如何将void分配给int?void意味着您实际上什么也不返回。nothingvoid怎么能分配给某个东西呢?如果我只输入binaryarg1或binaryarg2,程序将输出11或10,你应该知道你在屏幕上输出的不是你的函数返回的结果!无效二元体;返回一个void,那么如何将void分配给int?void意味着您实际上什么也不返回。nothingvoid怎么能分配给某个东西呢?如果我只输入binaryarg1或binaryarg2,程序将输出11或10,你应该知道你在屏幕上输出的不是你的函数返回的结果!它在作业说明中。“我希望我能那样做。”安德斯·K:你发帖时作业标签不在那里。我是在布莱克做出上述评论后加上的。它在作业说明中。“我希望我能那样做。”安德斯·K:你发帖时作业标签不在那里。我在Blake发表上述评论后添加了它。这很有帮助,但现在我的c[]数组的输出都是1'sIt,这意味着你的程序中有一些逻辑错误。尝试
使用调试器或调试打印查找错误并修复。原因是您只返回最低有效位。在递归函数中,您将丢弃所有其他位。看到我的答案了。这很有帮助,但是现在我的c[]数组的输出都是1's,这意味着你的程序中有一些逻辑错误。尝试使用调试器或调试打印找到错误并修复。原因是您只返回最低有效位。在递归函数中,您将丢弃所有其他位。看看我的答案。