从按位'OR'操作中取一个共同点

时间:2015-07-21 15:55:33

标签: bit-manipulation operator-keyword

如果我们有一个操作( x A | x B ),其中' | '是' OR '运算符然后需要将 x 从操作中取出并乘以左边的结果。

例如,让 P =(x A | x B)

然后不知何故, P = x *(这里有一些表达)

请告诉我这是否可行以及表达方式。

1 个答案:

答案 0 :(得分:0)

对于这个答案,我假设32位整数(实际上它更通用,但它对ℤ不起作用)。

这是可能的,但这不是优化。考虑x奇数的情况:

x有一个模乘法逆,我们称之为inv(x)。现在插入模板
P = x * ExprExpr = inv(x) * (x * A | x * B)

结果表达式为x * inv(x) * (x * A | x * B) = x * A | x * B

考虑x是偶数的情况。观察到将x乘以2会使x * A | x * B两倍大,即使是非线性" OR"涉及操作,因为乘以2只是左移,左移是OR。

将因子x导入y * d,其中y为奇数,d为2的幂。现在让"均匀"来自x的最终乘法,并写Expr = inv(y) * (y * A | y * B)

将其重新插入到模板中,我们得到y * d * inv(y) * (y * A | y * B),这会简化为d * (y * A | y * B),再次为x * A | x * B

这种情况实际上是一般情况,因为对于奇数dx可以设置为1。