2013-08-20 106 views
1
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int a = 50; // 110010 
    int b = 30; // 011110 

    if (a & b) { 
     printf("Hi"); 
    } 
    return 0; 
} 

上面的代碼打印出嗨。按位與行爲與預期不同?

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    int a = 50; // 110010 
    int b = 13; // 001101 

    if (a & b) { 
     printf("Hi"); 
    } 
    return 0; 
} 

上面的代碼不打印任何東西。

從邏輯上講,你會認爲按位AND意味着二進制中的所有數字都必須匹配才能返回true。實際上,二進制中的每個數字必須不同才能返回false。

我不明白點位AND。

我也明白,假相當於0℃。

+0

谷歌搜索 「位掩碼」 可能的幫助。 –

+0

邏輯上,如果二進制數字中的所有數字都匹配,那麼與'a == b'沒有區別。 – antak

回答

0

這正是按位和的目的。它主要用於掩碼測試。最終效果是保持所有常見的1,並將其他所有內容清零。說,比如你想測試,如果第3位是1,你可以只寫

if (a & 4 /*0100*/) 
    // do something 

由於KARTHIK說,有其他的方法來比較操作數你所期望的方式。

2

這是一個位&。這意味着操作的結果是在兩個操作數上逐位應用&的結果。

int a = 50; // 110010 
int b = 30; // 011110 

a & b == 010010 == 18 == true 

如果你想讓所有的位相等,那只是==。或者你會按位&它與111111

2

就像Karthik說這是按位。

int a = 50; // 110010    int a = 50; // 110010 
int b = 30; // 011110 &    int b = 13; // 001101 & 
       ¯¯¯¯¯¯¯        ¯¯¯¯¯¯¯ 
       010010 = 18       000000 = 0 --false 
1

運算符是按位,這意味着它會逐位比較兩個變量的二進制表示。當你有

int a = 50;   // 110010 
int b = 30;   // 011110 
int result = a & b; // 010010 

會發生什麼情況是這樣的:的result位是基於位的ab值設置。比較ab中的每一對相應位。這裏,由於ab這兩者的第二和第五位(從右邊開始)都是1,即爲真,所以這些比特的比較結果爲真,相應地,result中的第二和第五比特也被設置爲真。因此,result非零。對a & b進行非零的評估將導致"Hi"在您的第一個示例中進行打印。

在您的第二個例子:

int a = 50;   // 110010 
int b = 13;   // 001101 
int result = a & b; // 000000 

有在50和13的二進制表示,其中對應位在任何情況下:所述第一比特(從右側)是關閉的50,在13 ;反之亦然第二位,等等。因此,相應位的比較在每種情況下均爲0,並且在result中沒有對應的位開啓。因此result評估爲零。這個零結果導致"Hi"不能在你的第二個例子中打印。

至於該運算符的效用:按位運算在嵌入式系統編程中至關重要。它們對於某些問題也非常有效(例如用於生成素數的Eratosthenes類型程序)。按位或在密碼學中很有用。名單繼續...

0

「邏輯上,你會認爲按位AND意味着二進制中的所有數字必須匹配才能返回true,實際上,二進制中的每個數字都會有對於返回錯誤的條件是不同的。「

它們不一定是不同的。例如,如果兩個位均爲零,則會產生零。 XOR是邏輯運算符,只有在位不同時才返回true,而XNOR只有在它們相同時才返回true。由於任何非零值都是真的,那麼要使AND返回true,則只需要在兩個操作數中都有1位爲1。相反,如果兩個操作數都沒有共同的1位,它將返回false。

1

您不清楚的是,在C中,數字0是錯誤的,並且任何其他數字都是正確的。

if (0) { 
    printf("hi"); 
} 

會做什麼,所以如果逐位和操作不產生一組位,你可以有效計算的if語句看起來像

if (false) { 
    printf("hi"); 
} 

其他人一樣有做了一個顯示位操作的好例子,我會推遲他們的數學。

1

案例1:

int a = 50; // 110010 
int b = 30; // 011110 
if (a & b) =>if (50 & 30) => if(1 1 0 0 1 0 &  => if(010010)=> if(18)=> 
           0 1 1 1 1 0 ) 
if(18)=>if(TRUE)=> printf("Hi") 

案例2:

int a = 50; // 110010 
int b = 13; // 001101 
if (a & b) =>if (50 & 13) => if(1 1 0 0 1 0 &  => if(000000)=> if(0)=> 
           0 0 1 1 0 1 ) 
if(0)=>if(FALSE) => NO printf("Hi")