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

Why (3 & 0x1111) = 1?

我不明白为什么 3 & 0x1111 = 1?好像是:

for any unsigned 32-bit integer i, i & 0x1111 should be i, right?

然而,当我在 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;
} 

将它们都转换为二进制:

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

当你&他们的一点一滴,你还期待什么?

& 运算符应用二进制与。 0x 表示十六进制而不是二进制,所以如果我们将 0x1111 写入二进制,我们将得到: 0001 0001 0001 0001 二进制。 3二进制是011

0001 0001 0001 0001 & 
0000 0000 0000 0011 =
0000 0000 0000 0001 = 1

在 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

如果你想用所有 1 构造一个掩码,在十六进制中,它应该是

0xffffffff = 1111 1111 1111 1111 1111 1111 1111 1111

0x1111 是二进制的 0001000100010001。所以 0x1111 & 30001000100010001 & 0000000000000011 = 0000000000000001

3d = 3h = 11b

1111h = 0001000100010001b

所以:

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

0x1111 是 4369,或者二进制:0001000100010001 因此,屏蔽掉的 3 (0011) 将是 0001。 同样,19 (0001011) 将是 17 (00010001)