2015-08-27 52 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)

相关问题