为什么(3&0x1111)= 1?

zel*_*ell 3 c bit-manipulation

我不明白为什么3&0x1111 = 1?看起来:

对于任何无符号的32位整数i,i和0x1111应该是i,对吗?

但是当我在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;
} 
Run Code Online (Sandbox Code Playgroud)

Cod*_*ent 17

将它们都转换为二进制:

0x1111 = 0001 0001 0001 0001
3      = 0000 0000 0000 0011
Run Code Online (Sandbox Code Playgroud)

当你&一点一点地说,你还期待什么?


060*_*002 7

在C中,任何以数字为单位的数字0x都是十六进制数.所以你使用的位掩码是1111十六进制的.在掩码中,位#0,#4,#8和#12是1s,其余是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
Run Code Online (Sandbox Code Playgroud)

如果你想用1十六进制构造一个包含所有s 的掩码,它应该是

0xffffffff = 1111 1111 1111 1111 1111 1111 1111 1111
Run Code Online (Sandbox Code Playgroud)