2011-09-16 81 views
2

我正在從一個程序讀取命令行中的兩個十進制數字,將它們轉換爲二進制,將它們相加,然後輸出二進制和十進制的和。將函數輸出到int數組中

我做了一個將十進制輸入轉換爲二進制的函數,但現在我無法弄清楚如何將這些值轉換爲int數組。

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

我的函數轉換成3和11 2到10

現在我需要把這些值在int數組的末尾,以便它看起來像這樣:0000000000000000000000000000011和00000000000000000000000000000010

這樣我的邏輯添加二進制數可以正常工作。

這裏是我的嘗試,但它說,它可以從虛空分配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; 
} 

任何意見或建議,將不勝感激!

+1

'無效二進制(INT);'返回'void'所以你怎麼能分配'無效'到'int'? 「void」意味着你實際上沒有返回任何東西。怎樣才能將任何東西('void')分配給某個東西('int')? –

+0

好,如果我只是把二進制(arg1)或二進制(arg2)程序將輸出11或10 – Blake

+0

你應該明白,你輸出在屏幕上,不是你的函數返回! – Shahbaz

回答

0

由於輸入是十進制的,爲什麼要添加兩個二進制表示的小數?將每個數字顯示爲二進制數字會更簡單,但使用十進制值進行添加,然後以二進制表示形式顯示結果。

編輯:好沒有看到你的作業標籤在第一次。

你的二進制()函數可以返回一個int向量,在你的二進制函數中創建向量並返回它。例如

vector<int> binary(int n); 

在主程序可選地創建一個數組,該數組傳遞到二元函數,然後打印的二進制文件的內容返回之後。例如

void binary(int n, int maxSizeArray, int* binArray); 
+0

它在作業的指示。我希望我能做到這一點。 – Blake

+0

@Anders K .:發佈時您的作業標籤不存在。我在Blake提出上述評論後添加了它。 – Mysticial

0

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

方法binary()空隙方法。您應該返回一個int的值,以便將其分配給[i]。

0

這裏:

cout << remainder; 

正在打印的剩餘部分,並沒有返回它:

return remainder; 

而且不要忘了修改void binary(int number)int binary(int number)

+0

這有幫助,但現在我的c []數組輸出全是1的 – Blake

+0

這意味着程序中存在一些邏輯錯誤。嘗試使用調試器或調試打印來查找錯誤並修復。 –

+0

原因是你只返回最不重要的位。在你的遞歸函數中,你扔掉了所有其他的位。看到我的答案。 – Shahbaz

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; 
} 
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')的char數組。

P.S .:您的'二進制'是遞歸的。因爲每個人都知道使用遞歸函數而不是迭代函數(如果可能的話)會產生更慢的結果。

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

這樣,您可以將數組從最後一個位置填充到第一個,最後一個位置包含最低有效位。

現在,當你調用的函數,而不是

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