2015-07-10 44 views
-11

~iINT_MAX^i 這兩者之間的區別是什麼?在二進制文件但是當我們打印沒有。輸出是不同的,因爲顯示在下面的在按位操作中使用時會發生什麼?

#include <bits/stdc++.h> 
using namespace std; 
void binary(int x) 
{ 
int i=30; 
while(i>=0) 
{ 
    if(x&(1<<i)) 
     cout<<'1'; 
    else 
     cout<<'0'; 
    i--; 
} 
cout<<endl; 
} 
int main() { 
    int i=31; 
    int j=INT_MAX; 
    int k=j^i; 
    int g=~i; 
    binary(j); 
    binary(i); 
    binary(k); 
    binary(g); 
    cout<<k<<endl<<g; 
return 0; 
} 

代碼我得到的輸出作爲

1111111111111111111111111111111 
0000000000000000000000000011111 
1111111111111111111111111100000 
1111111111111111111111111100000 
2147483616 
-32 

爲什麼k和克不同?

+0

「〜」是一個「NOT」運算符。 '^'是一個'XOR'運算符。 –

+0

所以笏〜確實做到了嗎? –

+12

你的書有什麼問題?您的互聯網連接?你的研究工作在哪裏? –

回答

1

~是按位NOT,它將翻轉所有的位

a: 010101 
~a: 101010 

^XOR,這意味着一個位將是1IFF一個比特是0和其他是1,否則它將設爲0

a: 010101 
    b: 001100 
a^b: 011001 
+0

你沒有仔細閱讀這個問題 –

+3

@Ravish:你沒有仔細寫下這個問題 –

+1

我看了這個問題就好了,我正在解釋操作員是如何工作的。您生成輸出的方式不正確,因此您問題的前提不正確。 – CoryKramer

7

Kg是不同的 - 最顯著位是不同的。你不顯示它,因爲你只顯示31位。在k最高有效位是0(作爲兩個0的異或的結果)。在g中,作爲0的否定結果(i的最高有效位),結果爲1。

2

嘗試在您的二進制函數中設置i = 31;它不打印整個號碼。您將會看到kg不一樣; g最後有'負'標誌(1)。

整數使用第32位來指示數字是正數還是負數。您只打印31位。

~是按位NOT; 〜11100 =〜00011 ^是按位異或,如果只有一個或另一個,則爲true

0

你想要UINT_MAX。而你想使用unsigned int的INT_MAX只是沒有設置有符號位。 〜將翻轉所有的位,但是^將單獨留下符號位,因爲它不是在INT_MAX中設置的。

0

這種說法是錯誤的:

~iINT_MAX^i ...都給予同樣沒有。在二進制

它之所以出現他們給二進制 相同數量是因爲你打印出僅各個號碼的32位的31。 您沒有打印符號位。

INT_MAX的符號位爲0(表示一個正符號整數) 和期間INT_MAX^i 由於i符號位也爲0, 不改變和兩個零的XOR是0

~i的符號位爲1,因爲i的符號位爲0,並且操作將其翻轉過來。

如果你打印所有32位,你會看到二進制輸出的差異。

相關問題