【问题标题】:Multiplication using bitwise operations [closed]使用按位运算的乘法 [关闭]
【发布时间】:2022-06-16 09:15:23
【问题描述】:

我一直在寻找一种将布尔代数中的布尔函数扩展到经典代数的方法,我认为我需要的只是乘法和加法来做到这一点 假设 a,b 是 [0, 2 范围内的两个无符号整数32- 1],我们知道

a + b = a&b + a|b    / \"+\" is the ordinary addition in algebra

这是我想要的一半,现在我需要找到a*b 是什么。我尝试了以下方法:

if a = c*d then

cd + b = (cd)&b + (cd)|b
=> cd = (cd)&b + (cd)|b - b

这意味着在任何乘法中我都应该记住第三个变量?我正在寻找的是这样的

ab = f(a,b)

其中f(x,y) 是一个布尔函数

编辑:正如@DavidGrayson 提到的,我应该进一步澄清,我正在寻找的是一种使用带或不带代数运算符(+,-,...)的位运算符组合来描述 a * b 的方法,就像上面的 a + b 我们可以看到我们已经用位运算符描述了代数运算 \'+\',那么我们可以用乘法做同样的事情吗?

  • * 是 Markdown 语法中的特殊字符,导致斜体文本。尝试用斜杠转义以修复格式:\\*
  • 我不确定我明白你在这里问什么。您试图将其推广到乘法的身份 a + b = (a & b) + (a | b) 有什么特别之处?
  • a + b = a&b + a|b 并没有真正完成任何事情。您通过用一些按位运算替换它来“简化”加法,并且......另一个加法。为什么不“简化”为a + b = (a|a) + (b|b)
  • 对不起,我还是不明白你在这里问什么。您提到的加法的原始相等性并没有用更简单的操作代替加法,而只是在两个不同的上下文中涉及加法的恒等式。您希望通过乘法复制哪些具体见解?
  • 从 1bit*1bit 开始,然后是 2bit*2bit ...使用卡诺图仅获得布尔代数结果...但是对于 32bit * 32bit ,事情将非常复杂...这不是它在实际硬件中的完成方式.. . 通常布尔代数与 Shift 和 Add 或二进制长乘法等顺序自动机中的算术加法相结合......如前所述用相同的运算符定义运算符是无意义的......如果这样编码会导致堆栈溢出...... .

标签: math bit-manipulation bitwise-operators


【解决方案1】:

我仍然不知道你为什么要问这个问题,但你指定你正在寻找

一种使用带或不带代数运算符的位运算符组合来描述 a * b 的方法

您还在 cmets 中明确表示 * 是我们允许使用的代数运算符。

后来,您补充说必须有一个布尔运算符链接 a 和 b。

所以我会回答你的问题:

a * b = (a | (0 & (a | b))) * (b | 0)

这是a * b 的公式,它使用按位运算符,因此它满足您的所有条件。

【讨论】:

  • 从这个意义上说,我们也可以说 a + b = (a | 0) + (b | 0) 而不是 a + b = a&b + a|b 也许我无法充分澄清我的问题,但 (a|0) 是只是(a),也没有布尔运算符以某种方式链接 a 和 b 而它只是代数运算符 *
  • 你不断改变目标职位。
  • 我修改了我的答案,使其包含a | b。我可以类似地修改它以包含 a OP b 用于您想要的任何二元运算符。请点击复选标记。
  • 我的目标是找到这样的东西 a * b = a&b + .. + a|b .. 你正在做的只是像 a = a + b - b 这样加减你的方程是可逆的它的原始形式只是领先一步
  • 你等式中的“0”不符合我的条件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
相关资源
最近更新 更多