2011-06-06 72 views
1

參照我剛纔的問題,How can i implement AND and OR operations in c++錯誤執行「與」和「或」 C++

我的下一個問題是,有時候,它輸出例如110010 & 010101 = 110591.一些奇怪的號碼爲什麼會發生呢?

#include <iostream> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    long int s; 
    long int l; 
    long int r; 

    cin>>s; 
    cout<<endl; 
    cin>>l; 
    cout<<setfill('0')<<setw (5)<<s<<endl<<setfill('0')<<setw (5)<<l<<endl; 
    r=s|l; 
    cout<<r<<endl; 
    return 0; 
} 
+0

如果你知道他們在做什麼,他們不是「怪異的數字」;) – Marlon 2011-06-06 01:32:08

+1

請發佈你使用的代碼,因爲這些數字沒有意義。對於正數* x *和* y *,* z * = * x *&* y *,* z *不能大於* x *且* z *不能大於* y *。 – 2011-06-06 01:33:33

+0

// setw example #include #include using namespace std; int main(){ long int s; long int l; long int r; cin >> s; cout << endl; cin >> l; (5)<< s << endl << setfill('0')<< setw(5)<< l << endl; r = s | l; cout << r << endl; return 0; } – Shadi 2011-06-06 01:36:06

回答

1

對於這個問題 - 如何輸入二進制數字而不是小數。

你可以閱讀他們爲字符串,然後將其轉換假設他們是基地2

所以,這樣的代碼(未測試!):

std::string s_str; 

cin >> s_str; 
... 
// now convert as if it's a binary string, thats what the last arg following does 
s = strtol(s_str.c_str(), 0, 2); 
+0

我向上帝最好的回答,只有11代表。上帝保佑「你」的人 – Shadi 2011-06-06 02:14:13

1

a = b && c;將預型邏輯操作並將其存儲到一個; a = b || c;將預成型邏輯操作並將其存儲到一個;

a = b & c;將預型件按位操作並將其存儲到一個; a = b | c;將按位預處理操作並將其存儲到一個;

例子:

11 && 10 = 01 
10 && 01 = 01 
00 && 11 = 00 

11 || 10 = 01 
10 || 01 = 01 
00 || 11 = 01 

11 & 10 = 10 
10 & 01 = 00 
00 & 11 = 00 

11 | 10 = 11 
10 | 01 = 11 
00 | 11 = 11 
+0

所以,而不是使用a = b&c我使用a = b && c和相同的爲「或」 – Shadi 2011-06-06 01:29:27

+1

如果你只是想檢查真假之間是的 – Ali1S232 2011-06-06 01:31:22

+0

不,不,我不想讓a = b&c給我不是真的或假的,但實際按位操作,但它有時有效,但有時給我一個錯誤,如問題 – Shadi 2011-06-06 01:33:26

3

對於你最後的問題:

我的其他問題是,,有時 輸出例如 010101 = 110591一些奇怪的數字爲什麼是 發生

這個表示法,我寫的是奇怪的。第一個數字被視爲小數。 '010101'的第二個數字被視爲一個八進制數字,因爲它是'0'。對於顯示爲整數的數字,輸出應爲0。

這就是說,你確定你的符號是正確的嗎?此外,當你想做一個比特明智的&時,要非常具體地使用數字。最後,如果你真的需要處理二進制,一些編譯器允許'0b'表示法。對於其他人,我們非常喜歡使用HEX,例如:'0x'

希望它有幫助。乾杯!

+0

我只想使用按位運算「&」和「|」我不想要ocatal或其他什麼我怎麼修復它? – Shadi 2011-06-06 01:37:55

+0

@Shadi:爲什麼不呢?使用什麼數字表示並不重要,按位操作僅對位使用。例如,'255','0377'和'0xff'都表示相同的數字。 '120&43'爲您提供與0x78&0x2b完全相同的值。使用十六進制表示法是因爲十六進制和二進制之間的對應關係更加明顯。 – 2011-06-06 01:48:49

+0

@Shadi:是的,我同意在硅片上。他是對的,大多數程序員對HEX符號'0x'非常舒服。也就是說,如果你不喜歡八進制,那麼一定不要在你使用的數字前加'0'。乾杯! – Vern 2011-06-06 02:59:02

6

您似乎在輸入號碼110010,並且期望它是二進制的,因爲它只有1和0。該號碼是十進制號碼,您需要將其轉換爲二進制,以便按位操作將有意義。

decimal     binary 
--------------------------------- 
110010 = 0001 1010 1101 1011 1010 
010101 = 0000 0010 0111 0111 0101 
--------------------------------- 
110591 = 0001 1010 1111 1111 1111 (result of a | b) 

以上是您正在使用的數字的二進制表示,分爲四位組,因此它更易於閱讀。

+0

是的,所以你說我輸入的數字是十進制數字不是二進制,,這就是爲什麼我得到一個錯誤,我怎麼能代表它們在二進制,所以我可以得到正確的答案 – Shadi 2011-06-06 01:46:57

+1

你可以將所需的值轉換爲十進制,然後鍵入它們in。'110010 = 50'和'010101 = 21'。 '50 | 21 = 55',或'110111'二進制。用十六進制/十進制/二進制轉換得到一個好的計算器,這將變得更容易。 – 2011-06-06 01:49:43

+0

ahhh ,,現在事情更清晰了,我怎麼能在沒有任何計算器的情況下在C++中執行這個操作? – Shadi 2011-06-06 01:52:52

0

如果你想要二進制操作,你的輸入必須是二進制的,而不是十進制或八進制。

不幸的是,C和C++似乎不支持二進制文字。一些編譯器讓你用'0b'做前綴,所以110010 & 010101會寫成0b110010 & 0b010101,但顯然這不是可移植的。

一個選項是使用std::bitset,它允許您輸入一個二進制數字作爲字符串。

但是,鑑於您已經注意到這是作業,我預計std :: bitset不是您預期提供的答案,並且可以使用&並且|一般。您看到問題的唯一原因是因爲您輸入十進制和八進制格式的二進制數字 - 如果您輸入和操作所有格式的數字,則不會有問題。

+0

我可以使用std :: bitset,但是如果我不能如何操作數字以便我可以得到寫入答案 – Shadi 2011-06-06 01:56:20

+0

如果您的任務如另一個問題所示,「實現MIPS處理器」,那麼在沒有點你需要以字符串的二進制形式存儲一個數字。 – Kylotan 2011-06-06 12:31:38

2

使用std :: bitset的

#include <iostream> 
#include <bitset> 

int main() 
{ 
    std::bitset<8> val1; 
    std::bitset<8> val2; 

    std::cin >> val1 >> val2; 

    std::cout << val1 << " = " << val1.to_ulong() << "\n"; 
    std::cout << val2 << " = " << val2.to_ulong() << "\n"; 
    std::cout << "\n\n"; 

    std::cout << (val1 | val2) << " = " << (val1.to_ulong() | val2.to_ulong()) << "\n"; 

} 

運行:

> g++ t.cpp 
> ./a.out 
110010 
010101 
00110010 = 50 
00010101 = 21 


00110111 = 55 
從流中獲取二進制值