【问题标题】:Bit Manipulation Arithmetic and Order of Operations位操作算法和操作顺序
【发布时间】:2022-12-11 16:44:16
【问题描述】:

我是位操作的新手,刚遇到一种情况,要求我找到 XOR 的逆运算。原来是异或本身。这让我开始思考。

给定x = a ^ b | ~c & d,如果我给你xabd,你会如何求解c

如果我们回到基本算术,如果我有类似 x = a - b + c * d 的东西,我就知道运算的顺序以及如何将每个变量移动到等式的另一边。但我不知道如何用逻辑操作来做到这一点。

感谢任何帮助!

【问题讨论】:

  • 假设x = a | b,我告诉你xa1。你能解决b吗?
  • 好吧,我想 b 可以是 0 或 1。
  • 正确的。那么“solve for c”所需的结果格式是什么?一组所有可能的值?它甚至可能是无限的,例如 0 = 0 & b,其中 b 可以是任何诠释。
  • 好的,我明白了。我认为以与常规 +、-、*、/ 运算符相同的方式来考虑操作是错误的。谢谢
  • 好吧,不是真的。对于乘法,已经有一个类似的问题:x = a * b,给定xab可能没有一个明确的解决方案。即当a = 0。同样的事情发生在按位与(实际上与乘法密切相关)和或上,但在逐位级别上(因此您可能能够解决一些问题,但不能解决其他问题)。

标签: bit-manipulation


【解决方案1】:

一种方法是将所有内容转换为仅使用 & ^ 作为操作,以及所有的位向量(代码中为 ~0)。将 1 写成全 1 的位向量,将 0 写成全 0 的位向量。 (或者考虑单个位。)

这里有一个快速翻译的方法。将位 1 和 0 解释为 true 和 false,而不是分别解释为奇数和偶数,如奇数和偶数。然后 exclusive or 是当您添加整数时奇数/偶数发生的情况:例如奇数 + 奇数 = 偶数对应于 1^1=0。类似地,and 是整数相乘时奇数/偶数的结果。所以这些运算继承了整数的所有常用代数定律!

因此,将 x^y 写成 x+y,将 x&y 写成 xy,以提醒自己这一点。当奇数/偶数取反时会发生什么,即 x 变为 -x?奇数保持奇数,偶数保持偶数。正如您所发现的,加法和减法是相同的运算。

现在这是一个翻译表。 (最后两个可以使用真值表来检查。)

x^y变成x+y

x&y变成xy

x|y变成x+y+xy

~x变成1+x

让我们把它应用到你的方程式中。

x = a ^ b | ~c & d
  = (a ^ b) | ( (~c)& d )
  = (a + b) | ( (1+c)d )
  = (a + b) + (1+c)d + (a + b)(1 + c)d

现在假设我说 (x,a,b,d) = (1,1,1,1),c 是什么?

1 = (1 + 1) + (1 + c)1 + (1 + 1)(1 + c)1
  = 1 - 1 + 1 + c + (1 - 1)(1 + c)
  = 1 + c
So subtracting 1, which is the same as adding 1, gives,
0 = c.

现在让我们做我们通常可以做的代数来找到c。

x = (a + b) + (1+c)d + (a + b)(1 + c)d
  = (a + b) + d + cd + (a + b)d + (a + b)cd
  = (a + b)(1 + d) + d + d(1 + a + b)c
So, adding the parts without c to both sides
(d(1 + a + b))c = x + d + (a + b)(1 + d)

如果左侧 c 的乘数通过某些赋值计算为 0,则 c 可以是任何值,前提是右侧为零。如果在该赋值下右侧不为零,则无解。

如果左边 c 的乘数为 1,则右边是 c 值的公式,因此只有一个解。

什么时候 c 有两个或零个解?当左手乘数为零时。

d(1 + a + b) = 0

这发生在 d=0(1 + a + b)=0 时。最后一个等式等价于a = 1+b,因为1+b = ~b,解是 a≠b。这什么时候会导致两种解决方案?当右侧为零时。

x + d + (a + b)(1 + d) = 0 when d=0 or a = 1 + b
In the first case this evaluates to
x + a + b = 0 which is satisfied by x=a=b=1 or when one of x,a,b is 1.
In the second case this is
x + 1 = 0 which means x = 1

所以有两种解决方案

1. d=0 and ( x=a=b=1 or one of x,a,b is 1 )
or
2. a≠b and x=1

以类似的方式,当有一个解决方案时,当没有解决方案时,可以表征。这里重要的是想法,而不是确切的细节。

就像代数中的其他地方一样,有些情况会比其他情况更容易处理。求助于真值表的蛮力会使每种情况都变得非常棘手,而且常常难以理解,而且当存在潜在的简单事物时,它们可能会变得难以发现。

用 & | 做代数~(布尔代数)要难得多,因为取消事物很困难。除了常量出现在表达式中时的取消之外,取消仅使用吸收定律 a&(a|b)=aa|(a&b)=a 发生,它们是相当复杂的模式,可以引导表达式使用布尔代数的其他规则。

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2021-08-31
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多