了解单个与号运算符 (&) 在整数上的行为

Posted

技术标签:

【中文标题】了解单个与号运算符 (&) 在整数上的行为【英文标题】:Understanding the behavior of a single ampersand operator (&) on integers 【发布时间】:2011-06-13 01:09:48 【问题描述】:

我了解单与号运算符通常用于“按位与”运算。但是,任何人都可以帮助解释当您使用它来比较两个数字时得到的有趣结果吗?

例如;

(6 & 2) = 2
(10 & 5) = 0
(20 & 25) = 16
(123 & 20) = 16

我没有看到这些结果之间有任何逻辑联系,我只能找到有关比较布尔值或单个位的信息。

【问题讨论】:

你确定 (20 & 25) == 4? 您所看到的“按位与”运算的结果。 (除了(20 & 25) = 4 位,我认为这是一个错字。) 【参考方案1】:

按位 AND 正是这样做的:它对位进行 AND 操作。

因此,要预测结果,您需要查看位,而不是数字。

AND 给你 1,只有当两个数字在同一个位置都有 1 时:

6(110) & 2(010) =  2(010)
10(1010) & 5(0101) = 0(0000)

如果在同一位置的任一数字中都有 1,则按位 OR 将为您提供 1:

6(110) | 2(010) =  6(110)
10(1010) | 5(0101) = 15(1111)

【讨论】:

【参考方案2】:

Bitwize AND 将二进制符号中的位一一匹配,结果是两个数字之间共有的位。

要将数字转换为二进制,您需要了解二进制系统。

例如 6 = 110 二进制

110 代表 1x4 + 1x2 + 0x1 = 6。

2 然后是 0x4 + 1x2 + 0x1 = 2。

Bitwize 并且只保留两个数字都设置了位置的位置,在这种情况下,位为 2,结果为 2。

每个额外的位都是最后一位的两倍,因此 4 位数字使用乘数 8、4、2、1,因此可以表示从 0 到 15 的所有数字(乘数之和。)

【讨论】:

【参考方案3】:

在内部,整数存储在binary format 中。我强烈建议您阅读相关内容。了解数字的按位表示非常重要。

话虽如此,按位比较是比较参数的位:

Decimal: 6    &    2 = 2
Binary:  0110 & 0010 = 0010

【讨论】:

【参考方案4】:
6     = 0110
2     = 0010 
6 & 2 = 0010

20      = 10100
25      = 11001
20 & 25 = 10000

(看来你的计算是错误的)

等等……

【讨论】:

【参考方案5】:

二进制和运算是对整数执行的,以二进制表示。例如

110  (6)
010  (2)
--------
010  (2)

【讨论】:

【参考方案6】:

比较每一个的二进制表示。

    110 &     010 =     010
   1010 &    0101 =    0000
  10100 &   11001 =   10000
1111011 & 0010100 = 0010000

在每种情况下,只有当输入的左侧和右侧都为 1 时,结果中的数字才为 1。

【讨论】:

@Rekin:对于像这样的小数字,我几乎可以在脑海中在十进制、十六进制和二进制之间进行转换。我还找到了一个角落,可以将大部分 ASCII 表塞进去。 @Jefrrey,只是出于好奇-您是否在一些低级环境中工作?比如协议、消息传递或性能相关的软件? @Rekin:我处理很多与协议相关的东西,从串行端口上的位到消息队列和 XML Web 服务,并且经常不得不将它们全部硬塞到 Windows CE 中。跨度> 【参考方案7】:

您需要将数字转换为二进制表示,然后您会看到结果之间的联系,例如 6 & 2= 2 实际上是 110 & 010 =010 等 10 & 5 是 1010 & 0101 = 0000

【讨论】:

以上是关于了解单个与号运算符 (&) 在整数上的行为的主要内容,如果未能解决你的问题,请参考以下文章

按位运算符和单与号 [重复]

带与号的三元运算符[重复]

如何使用与号 (&) 替换匹配模式中的字符

|=(单管道相等)和 &=(单与号相等)是啥意思

如何在 QT 的语言翻译中使用与号字符串

在值中使用与号 (&) 时 List.js 不起作用