为什么 (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 是1
s,其余是0
s。这就是为什么你得到 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 & 3
是 0001000100010001 & 0000000000000011 = 0000000000000001
3d = 3h = 11b
1111h = 0001000100010001b
所以:
0001000100010001b
& 11b
-------------------
1b
0x1111 是 4369,或者二进制:0001000100010001
因此,屏蔽掉的 3 (0011) 将是 0001。
同样,19 (0001011) 将是 17 (00010001)
我不明白为什么 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 是1
s,其余是0
s。这就是为什么你得到 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 & 3
是 0001000100010001 & 0000000000000011 = 0000000000000001
3d = 3h = 11b
1111h = 0001000100010001b
所以:
0001000100010001b
& 11b
-------------------
1b
0x1111 是 4369,或者二进制:0001000100010001 因此,屏蔽掉的 3 (0011) 将是 0001。 同样,19 (0001011) 将是 17 (00010001)