C++ 函数输出到int数组
我正在开发一个程序,它从命令行读取两个十进制数,将它们转换为二进制,相加,然后输出二进制和十进制的总和 我制作了一个将十进制输入转换为二进制的函数,但现在我不知道如何将这些值转换为int数组 例如: 输入:./a.out 3 2 我的函数将3转换为11,将2转换为10 现在我需要把这些值放在一个int数组的末尾,所以看起来像这样:00000000000000000000000011和00000000000000000010 这样,我添加二进制数的逻辑就可以正常工作了 这是我的尝试,但它说它可以从void分配int:C++ 函数输出到int数组,c++,arrays,function,binary,C++,Arrays,Function,Binary,我正在开发一个程序,它从命令行读取两个十进制数,将它们转换为二进制,相加,然后输出二进制和十进制的总和 我制作了一个将十进制输入转换为二进制的函数,但现在我不知道如何将这些值转换为int数组 例如: 输入:./a.out 3 2 我的函数将3转换为11,将2转换为10 现在我需要把这些值放在一个int数组的末尾,所以看起来像这样:00000000000000000000000011和00000000000000000010 这样,我添加二进制数的逻辑就可以正常工作了 这是我的尝试,但它说它可以从
#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,这意味着你的程序中有一些逻辑错误。尝试使用调试器或调试打印找到错误并修复。原因是您只返回最低有效位。在递归函数中,您将丢弃所有其他位。看看我的答案。