Вывод функции в массив int - PullRequest
       9

Вывод функции в массив int

2 голосов
/ 16 сентября 2011

Я работаю над программой, которая читает две десятичные цифры из командной строки, преобразует их в двоичные, добавляет их, затем выводит сумму двоичных и десятичных чисел.

Я создал функцию, которая преобразуетдесятичный ввод в двоичном формате, но теперь я не могу понять, как получить эти значения в массиве int.

Например: Input: ./a.out 3 2

моя функцияпреобразует 3 в 11 и 2 в 10

теперь мне нужно поместить эти значения в конец массива int, чтобы он выглядел так: 0000000000000000000000000000011 и 0000000000000000000000000000010

Таким образом, моя логика для добавлениядвоичные числа могут работать должным образом.

Вот моя попытка, но она говорит, что она может присваивать int из void:

#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;
}

Любые идеи или предложения будут оценены!

Ответы [ 6 ]

0 голосов
/ 16 сентября 2011

Причина в том, что вы записываете двоичный файл в вывод, а не в массив. Что вам нужно сделать, это отправить массив в вашу функцию и заполнить его.

Например, скажем, функция выглядит следующим образом:

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;
}

Таким образом, вы заполняете массив от последней позиции к первой последней позицией, содержащей младший значащий бит.

Теперь при вызове функций вместо

for(i = 31; i >= 0; i--)
{
    a[i] = binary(arg1); //PROBLEM AREA
    b[i] = binary(arg2); //PROBLEM AREA
}

Вы пишете

to_binary(arg1, a, 31);
to_binary(arg2, b, 31);
0 голосов
/ 16 сентября 2011

... или вместо этого mumbo-jumbo с ограниченной функциональностью битовых операторов вы можете использовать функцию inline-Assembly (которая, я считаю, более эффективна; оптимизации нет, но на 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').

P.S .: Ваш ' двоичный файл ' является рекурсивным. Как всем известно, использование рекурсивных функций вместо итерационных (если это возможно) приводит к гораздо более медленным результатам.

0 голосов
/ 16 сентября 2011

Просто используйте битовые операции

#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;
}
0 голосов
/ 16 сентября 2011

Здесь:

cout << remainder;

вы печатаете остаток, а не возвращаете его:

return remainder;

И не забудьте изменить void binary(int number) на int binary(int number).

0 голосов
/ 16 сентября 2011

a[i] = binary(arg1); //PROBLEM AREA

Метод binary() является методом void .Вы должны вернуть значение int из него, чтобы иметь возможность присвоить его [i].

0 голосов
/ 16 сентября 2011

Поскольку входные данные являются десятичными, почему вы добавляете два двоичных числа? Было бы проще просто показать каждое число в виде двоичного числа, но выполнить сложение с использованием десятичных значений, а затем просто показать результат в двоичном представлении.

РЕДАКТИРОВАТЬ: хорошо, сначала не увидел тэг домашней работы.

ваша функция binary () может вернуть вектор типа int, создать вектор в вашей двоичной функции и вернуть его. например,

vector<int> binary(int n);

альтернативно создайте массив в своей основной программе, передайте массив двоичной функции и затем напечатайте содержимое двоичного файла после его возврата. например, * +1008 *

void binary( int n, int maxSizeArray, int* binArray );
...