如何制作和,或者不是,xor,加上只使用减法

时间:2016-01-02 09:45:39

标签: math logic

我读到有一台只使用减法的计算机。 怎么可能。对于加号操作数,它非常简单。 我认为逻辑操作数可以使用带有常量的减法来实现。

你们有什么想法?

1 个答案:

答案 0 :(得分:2)

  1. +

    很容易,因为您已经实现了minus

    • x + y = x - (0-y)
  2. NOT !

    在标准 ALU 中通常通过添加来计算减法:

    • -x = !x + 1

    因此,否定就是:

    • !x = -1 - x
  3. 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 比较只是减法+ 进位标志检查。此外,所有+都可以重写和优化,以便使用-来更好地适应这种奇怪的架构

  4. 位移<<,>>

    z=x>>1
    z0=x1;
    z1=x2;
    z2=x3;
    z3=0;
    
    z=x<<1
    z0=0;
    z1=x0;
    z2=x1;
    z3=x2;