我读到有一台只使用减法的计算机。 怎么可能。对于加号操作数,它非常简单。 我认为逻辑操作数可以使用带有常量的减法来实现。
你们有什么想法?
答案 0 :(得分:2)
加+
很容易,因为您已经实现了minus
:
x + y = x - (0-y)
NOT !
在标准 ALU 中通常通过添加来计算减法:
-x = !x + 1
因此,否定就是:
!x = -1 - x
AND &
,或|
,XOR ^
很抱歉没有关于高效AND,OR,XOR
实施的线索,没有关于架构的更多信息,然后从 MSB 到 LSB 单独测试每个位。所以首先你需要知道一个数字的位值,所以让我们假设 4位无符号整数数字,以便简化x=(x3,x2,x1,x0)
其中x3
是 MSB 和x0
是 LSB 。
if (x>=8) { x3=1; x-=8; } else x3=0;
if (x>=4) { x2=1; x-=4; } else x2=0;
if (x>=2) { x1=1; x-=2; } else x1=0;
if (x>=1) { x0=1; x-=1; } else x0=0;
这就是如何获得数字
x=0
if (x0) x+=1;
if (x1) x+=2;
if (x2) x+=4;
if (x3) x+=8;
或者像这样:
x=15
if (!x0) x-=1;
if (!x1) x-=2;
if (!x2) x-=4;
if (!x3) x-=8;
现在我们可以执行 AND,OR,XOR 操作
z=x&y // AND
z0=(x0+y0==2);
z1=(x1+y1==2);
z2=(x2+y2==2);
z3=(x3+y3==2);
z=x|y // OR
z0=(x0+y0>0);
z1=(x1+y1>0);
z2=(x2+y2>0);
z3=(x3+y3>0);
z=x^y // XOR
z0=!(x0+y0==1);
z1=!(x1+y1==1);
z2=!(x2+y2==1);
z3=!(x3+y3==1);
PS 比较只是减法+ 进位和零标志检查。此外,所有+
都可以重写和优化,以便使用-
来更好地适应这种奇怪的架构
位移<<,>>
z=x>>1
z0=x1;
z1=x2;
z2=x3;
z3=0;
z=x<<1
z0=0;
z1=x0;
z2=x1;
z3=x2;