想象我们的任务是使用一个理想化的科学计算器,它具有以下属性:
不直接支持按位运算或基数转换(例如不能简单地“转换为”基数 2 或基数 16 等)
全面支持四种基本算术函数(+、-、*、/)
完全支持三角函数、对数、指数、根。为了简单起见,我们可以假设三角函数仅使用弧度。
支持括号和标准 PEMDAS 运算顺序
Even 完全支持以下分段函数
-- ceil (朝向正无穷大)
-- 下限(向负无穷大)
-- 截断(去掉小数部分,例如向零舍入)
--绝对值
-- 符号(负数产生 -1,正数产生 +1,精确的零产生零)
-- 模(与 b*(a/b-floor(a/b)) 相同)
它可以处理 N 位有效数字的精度,其中 N 的大小并不是非常相关。我加入这个附带条件只是因为当我们没有定义某种有限的精度界限时,数学可能会变得很奇怪。
计算器还可以将读数上的各个数字存储和调用到几个寄存器中,清除每个或所有寄存器,并清除显示。
是找出一种仅使用此计算器计算任意两个任意非负整数的按位“与” 或 按位“或”的方法。
按位“not”很容易通过以下表达式完成:
2^ceil(log(输入+1)/log(2)) - 输入 - 1
反转输入值的每个二进制位,直到但不超过其最高有效位。
对于固定不变的位宽度也可以做同样的事情:
2^bitWidth - 输入 - 1
只要输入< 2^bitWidth
可以通过输入*2轻松处理向更高有效位的按位移位(也称为左移位,假设最高有效位在前并且向左写入符号)
约束
我已经尝试过简单加法的变体来实现“或”输出,但是能够检测和/或纠正潜在的进位仍然阻碍了我这种方法。 例如 a+b == a⋁b 当且仅当 (a⋀b==0)。我是否能够检测何时 (a⋀b!=0),和/或反转进位(从结果中减去 a⋀b*2),这可以让我更近一步。
您可以像这样提取
b
的二进制数字
b0 = x%1
b1 = (x/2)%1
b2 = (x/4)%1
...
并重建回来:
b = b0 + 2*b1 + 4*b2 + ...
现在你可以像这样计算c = a AND b
:
c0 = a0*b0
c1 = a1*b1
c2 = a2*b2
...
c = c0 + 2*c1 + 4*c2 + ...
现在您已经实现了 AND 和 NOT,因此您可以使用 德摩根定律 来使用 NAND 实现任何逻辑函数...
NOT(A OR B) = NOT(A) AND NOT(B)
NOT(A AND B) = NOT(A) OR NOT(B)