2015-08-27 81 views
3

我看不出爲什麼3 & 0x1111 = 1?看來:爲什麼(3&0x1111)= 1?

對於任何無符號的32位整數我,我& 0x1111應該是我,對嗎?

但是,當我在ubuntu 14.04上試過這個,我得到了3 & 0x1111=1。爲什麼?

int main() { 
    unsigned int a =3; 
    printf("size of a= %lu\n",sizeof(a)); 
    printf("value of 3 & 0x1111= %d\n",a & 0x1111); 

    return 0; 
} 
+3

對於任何無符號32位整數i,我&0xffffffff應該是我 – cerkiewny

+0

你只掩飾了第一位,所以它正常變爲1 – Nasr

+1

@cerkiewny:對於任何'uint16_t',但對於32位類型。 「0xFFFF」只有16個「1」位。 – Olaf

回答

18

轉換他們兩個二進制:

0x1111 = 0001 0001 0001 0001 
3  = 0000 0000 0000 0011 

當你&他們的點點滴滴,還有什麼你期待什麼呢?

+0

我看到了。我的壞,我有點困惑1和f :) – zell

+0

如果你想用二進制而不是十六進制編寫,你可以這樣做:0b1111111111111111 == 0xffff(但注意這只是16位 - a 32位整數將有8個十六進制數字) –

+1

看到投票差異是兩個答案公佈之間的字面距離彼此是有點可怕。不過,它仍然是一個很好的答案:) – rayryeng

1

&運算符應用二進制和。 0x表示十六進制而非二進制,所以如果我們將0x1111寫入二進制,我們將得到: 0001 0001 0001 0001二進制。 3二進制是011

0001 0001 0001 0001 & 
0000 0000 0000 0011 = 
0000 0000 0000 0001 = 1 
+0

二進制3不是101,而是011 – user3629249

+0

「二進制」是什麼意思爲&運算符?您的操作說明沒有意義。 – rayryeng

+0

它的「二進制」和「 – cerkiewny

7

在C中,任何數字文字起始與0x是一個十六進制數。所以你使用的掩碼是十六進制的1111。在掩碼中,位#0,#4,#8和#12是1 s,其餘的是0s。這就是爲什麼你得到1

0x1111 = 0000 0000 0000 0000 0001 0001 0001 0001 in binary 
    3 = 0000 0000 0000 0000 0000 0000 0000 0011 in binary 
------------------------------------------------ 
    1 = 0000 0000 0000 0000 0000 0000 0000 0001 after doing biwise AND 

如果你想構建與所有1個口罩,以十六進制,它應該是

0xffffffff = 1111 1111 1111 1111 1111 1111 1111 1111 
3

0x11110001000100010001二進制。所以0x1111 & 30001000100010001 & 0000000000000011 = 0000000000000001

4

3D = 3H條件= 11b

1111h = 0001000100010001b

這樣:

0001000100010001b 
&    11b 
------------------- 
        1b 
2

0x1111是4369,或作爲二進制:0001000100010001 因此,3(0011)掩蔽相應地,19(0001011)將是17(00010001)

相關問題