当前位置: 首页 > 知识库问答 >
问题:

这个方程x+y=x&y+xy如何成立(假设x,y>0)?

花永昌
2023-03-14

我最近参加了一个代码部队的比赛。 在竞赛的编辑部分,我看到了位运算符之间的一个漂亮的关系,即x+y=x&; y+xy。 我还不知道证据。 我取了几个数字,看看这个方程式是不是真的。 我很兴奋知道证据。 我上网查了一下,找不到任何有意义的参考资料。 请帮我找到证明,或者至少给我这个美丽方程式背后的直觉。 提前致谢

共有3个答案

艾正浩
2023-03-14

对于x和y,您可以拆分位,将它们相加,并得到相同的答案,对吗?
示例:

0101 (x) + 0110 (y) == (0100 + 0001) + (0100 + 0010)

现在。 查看逻辑运算符:
a&; b给出两个数字中的位(读:计数2)
a b给出两个数字中的位(读:计数≥1)

所以基本上,你取两个数字中的位,把它们相加:

0111 == 0100 (in x, y) + 0010 (in y) + 0001 (in x)

您还需要取两个数字中的位(即需要计数两次的位),并将其加到和:

0100 == 0100 (in x, y)

因此,您最终将出现一次,一次的位和出现两次,两次的位相加:

0111 (bits that appear once or twice) + 0100 (bits that appear twice)
长孙淳
2023-03-14

所以,当你试图计算出按位计算时,最简单的方法就是为所有情况制作一个图表,特别是当变量很少的时候。

 A | B | A AND B | A OR B |     A + B     | (A AND B) + (A OR B)
---+---+---------+--------+---------------+----------------------
 0 | 0 |    0    |    0   |   0 + 0 = 0   |     0 + 0 = 0
---+---+---------+--------+---------------+----------------------
 0 | 1 |    0    |    1   |   0 + 1 = 1   |     0 + 1 = 1
---+---+---------+--------+---------------+----------------------
 1 | 0 |    0    |    1   |   1 + 0 = 1   |     0 + 1 = 1
---+---+---------+--------+---------------+----------------------
 1 | 1 |    1    |    1   |   1 + 1 = 2   |     1 + 1 = 2

现在您可能可以看到:

  • 如果a==b,则a+ba&; B+AB本质上是相同的。
  • 如果a!=b,则a&; B+A B可能会改变两个值的顺序,但当然,A+B=B+A,因此它们本质上与while相同。
齐向笛
2023-03-14

假设您正在执行A+B

请注意,将a的第i位数字(从最右边的数字开始计算)与b的第i位数字交换不会影响和。 示例:123+456==156+423。 无论基的选择如何,这都是有效的,因此它也适用于二进制加法。

接下来,请注意,从a+ba&b+ab的转换可以通过以上述方式(二进制)交换一些数字来完成。 如果a[i]==1b[i]==0,则交换a[i]b[i]; 之后,a变成a&bb变成ab。 因此,这种转换并不影响结果。

 类似资料:
  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • X|Y

    描述 (Description) 逻辑运算符[X|Y]匹配X或Y. 例子 (Example) 以下示例显示了逻辑运算符的用法。 package com.wenjiangs; import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogicalOperatorDemo { private sta

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。

  • Returns an SVG markup string for the blur filter Parameters xnumberamount of horizontal blur, in pixels ynumberamount of vertical blur, in pixels Returns: string filter representation Usage var f = pa

  • Returns y coordinate for given point after transformation described by the matrix. See also Matrix.x Parameters xnumber ynumber Returns: number y

  • Returns x coordinate for given point after transformation described by the matrix. See also Matrix.y Parameters xnumber ynumber Returns: number x

  • Skews the matrix Parameters ynumberAngle to skew along the y-axis (in degrees). xnumberAngle to skew along the x-axis (in degrees).