2012-09-19 111 views
2

簡單問題在這裏。 XOR運算符(^)有問題。我可以XOR整數很好,並得到正確的結果;然而,當XORing兩個字符時,什麼也不會返回:XOR運算符C++

int main() { 
    char a = 'a'; 
    char b = 'b'; 
    char c; 

    c = a^b; 
    cout << c << endl; 
} 

沒有任何反應。沒有輸出。我在這裏做錯了什麼。我試圖用XOR加密給定鍵的字符串,但是這個操作有問題。我想我可以得到ASCII值並將其轉換爲相應的字符,但此工具將用於加密文件以及純文本,所以我想不惜一切代價避免這種情況。

+5

你會得到輸出,你只是看不到它。 –

+0

@MooingDuck爲什麼不呢? – 0x499602D2

+2

該操作的結果是'1',低於32的ASCII值是「不可打印的」。一個表示數據的結束,一個是新行,一個是回車,一個是嘟嘟聲......見http://www.asciitable.com/(我懶得做出好答案,別人做它) –

回答

1

std::ostream::operator<<(和std::coutstd::ostream)輸出格式化文本。當你傳遞一個char時,它會嘗試格式化並輸出一個字符(認爲是ASCII)。如果char不是可打印字符,則不會將其打印出來(出於顯而易見的原因)。如果你想讓它輸出格式化整數,你需要將其強制轉換:

char a = 'a'; // 'a' == 0x61 
char b = 'b'; // 'b' == 0x62 
char c = a^b; // 0x61^0x62 == 0x03 
std::cout << static_cast<int>(c) << std::endl; 

對於它的價值,如果你使用的格式化輸出功能std::ostream::write,它將輸出格式化字符。但是,要小心,因爲如果你試圖寫出一個不可打印的字符,它會「工作」,但是你的控制檯不會顯示它(因爲它又是一個不可打印的字符)。

+0

'static_cast (c)'和'只是'(int)c'或'int(c)'有什麼區別? –

+0

@DavidHunt:'static_cast <>'做了一些檢查,以確保轉換或多或少是安全的,例如 - 你不會意外地將'const T *'指針轉換爲'T *' d必須使用'const_cast <>'),或者從'int *'到'double *'(你需要'reinterpret_cast <>')。 –

2

'a'^'b'的結果是一個不可打印的字符,即'\3'

4

'a'^'b'0x61^0x62)導致3,這是一個不可打印字符ASCIIETX,因此沒有打印輸出。

2

試試這個。

#include <iostream> 
#include <iomanip> 

int main() { 
    char a = 'a'; 
    char b = 'b'; 
    char c; 

    c = a^b; 
    std::cout << std::hex << static_cast<int>(c) << std::endl; 
} 
+0

'std :: cout << hex << c'將不起作用... [std ::]'hex'適用於顯示數字,而'c'仍然被當作字符處理。你需要將'c'施加到短/ int/long .... –

+0

是的。這應該教我在發佈前編譯和測試:) – EvilTeach