【问题标题】:are there any pairs (x,y) such that x<<1 == y>>1?是否有任何对 (x,y) 使得 x<<1 == y>>1?
【发布时间】:2016-10-20 00:44:47
【问题描述】:

是否有任何对 (x,y) 使得 z = x&lt;&lt;1z == y&gt;&gt;1 其中 x != y

假设我们有 x=0010 和 y=1000
现在如果我们将 x 左移 1 并将 y 右移 1
即 x>1=0100 所以我们对这两种情况都有相同的结果,即 0100

那么是否有任何其他对 (x,y) 给出相同的结果 z ?

如果是,那么是否有任何方程式可以找出这些对

【问题讨论】:

  • x=y=0 浮现在脑海中......
  • 你的回答不完整,你知道找到这样对的任何方程式吗?
  • 因此评论。一般来说x &lt;&lt; 1 = y &gt;&gt; 1 x * 2 = floor(y / 2) 假设正无穷精度整数。

标签: binary integer bit-manipulation bit-shift


【解决方案1】:

@doynax 观察到:

x << 1 = y >> 1 <=> x * 2 = floor(y / 2)

如果 y 是偶数,则使用 floor(y/2)==y/2; floor(y/2)=(y-1)/2 如果 y 是奇数,我们得到两个方程:

(even y):   x * 2 = y / 2
(odd y):    x * 2 = (y-1)/2

简化:

(even y)    x * 4 = y
(odd y)     x * 4 = y - 1  ==>   x * 4 + 1 = y

我们注意到 x * 2,因此 x * 4 是偶数。 所以 x 的任何值都有一个对应的 y(偶数 y)方程。

同样,x * 4 是偶数,x * 4 + 1 是奇数,所以任何 x 的值通过(奇数 y)方程有一个对应的 y。

所以,这些值很容易生成。

  1. 选择任何 X。
  2. X*4 和 X*4+1 都是 Y 的有效值。
  3. Z 为 X*2

这假定无限精度整数。如果你在一个 N 位字长的真实 CPU 上工作,X>=2^N/4 的值将不起作用,因为典型的移位会丢失顶部的位。

【讨论】:

    【解决方案2】:

    一般数字左移是(number^number_of_left_shifts),数字右移是(number/number_of_right_shifts)

    您可以尝试使用以下等式, x^1=y/2 y=2(x^1)

    上面的等式只有一个左移或右移尝试用你需要的 number_of_shifts 代替

    【讨论】:

    • 您可以通过设置满足上述方程的 x 和 y 值来尝试许多示例
    • 如果我使用下面的值 x=10=01010 y=20=10100 x>1=z2=01010 这里 z1!=Z2 这个方程不完全在所有情况下都是正确的
    • @AkhilChalla:那你为什么“接受”这个答案?
    【解决方案3】:

    代入 a,b 值,使其满足以下等式 a^2=b/4 b=4(a^2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多