Binary 仅使用位逻辑查找二进制中两个整数的最大值

Binary 仅使用位逻辑查找二进制中两个整数的最大值,binary,integer,max,boolean-logic,Binary,Integer,Max,Boolean Logic,这是一个有点棘手的问题,我认为对于那些能够胜任这项任务的人来说,这是一个很好的挑战。我确实搜索了之前问过的所有问题,但是我找不到我想要的 这里的目的是,给定在n位上用binary写入的2个整数,仅对每个整数的n位进行逻辑运算(AND、OR、…)(如果第一个整数最大,则结果为0,否则结果为1)。最终,目标是能够绘制一个电子电路,其中2*n位是有张力或无张力的导线,并将导线插入执行逻辑操作的实际电子元件中 我开始思考这个问题,因为我意识到无论发生什么(即,无论n是什么),2^n都大于2^0+…+2^

这是一个有点棘手的问题,我认为对于那些能够胜任这项任务的人来说,这是一个很好的挑战。我确实搜索了之前问过的所有问题,但是我找不到我想要的

这里的目的是,给定在n位上用binary写入的2个整数,仅对每个整数的n位进行逻辑运算(AND、OR、…)(如果第一个整数最大,则结果为0,否则结果为1)。最终,目标是能够绘制一个电子电路,其中2*n位是有张力或无张力的导线,并将导线插入执行逻辑操作的实际电子元件中

我开始思考这个问题,因为我意识到无论发生什么(即,无论n是什么),2^n都大于2^0+…+2^(n-1)(从数学上讲,这很容易得出)。这意味着,当另一个整数中的对应位为0,且n和k之间的所有其他位(k左边的所有位)相同时,任何一个整数的位(比如数字k)为1的,都是最大的。例如:

A:010(1)1011大于 B:010(0)1111,有效位在括号内。它左边的所有位都是相同的,我们不必关心其他的

因此,我们可以对所有的位对执行异或(XOR):有效位将产生1,然后我可以在a的相应位之间执行与非异或,这样,如果a的第k位是1,它将产生0,如果B的第k位是1,它将产生1。
唯一的问题是。。。有效位右边的位呢?它们可以不同(因此在执行XOR时也会产生1),但我必须忽略这一点。。。有什么想法吗?

我将通过在二进制的第二个运算符中添加一个数字来迭代这两个数字(我们称它们为ab),直到其中一个数字变为0

如果其中一个数字为0,另一个大于0,则两个数字的最大值为

第一个回路:

a&1 b&1酒店

第二圈:

a&10 b&10

第三圈:

100英镑 b&100

等等

要在操作后检查其中一个数字是否等于零,您可以(给定n,已知数字的长度)在最有效的n+1位置使用n乘以零加1的数字进行and


我的2分(可能错了):)你喜欢硬件实现,所以我想你最好把
a
B
当作有符号的N位整数,然后

  • B
    转换为其
    -B
    表示
  • 用一个N位将
    A
    B
    相加
  • 使用结果符号作为2输入N位多路复用器的选择器变量
  • 当然,它只能用逻辑函数来表达

    关于第三点,更详细地说,只需检查符号
    S
    (1:negative,0:positive)即可满足谓词
    B>A
    。因此,如果多路复用器对选择器值0的输入为
    A
    (而对选择器值1的输入为
    B
    ),您就得到了结果。在相等的情况下,您仍然选择
    A
    ,但是
    A=B
    ,因此从逻辑上讲,您选择哪个是无关的

    作为A和B变量,这是最明智的方法,因为您可以重用加法器进行加法。我想,针对检查最大值的特定情况进行优化肯定是可能的

    附加评论:

    必须强调的是,逐步检查
    A
    B
    的每个数字的顺序实现在最坏的情况下需要进行
    N
    检查以返回结果。如果
    A
    B
    有两个值流,则必须保证能够跟上它们。因此,max()函数的逻辑以数据流频率的
    N
    倍工作。从另一个角度来看,您需要降低数据输入max()逻辑的速率


    相反,我建议的组合实现(或任何优化)与硬件资源交换速度。换句话说,它可以以最快的速度为
    A
    B
    生成数据。与顺序实现相比,组合实现的传播延迟通常更高,但这不是频率方面的问题。

    有一些数学可以说明您想要做什么,例如cmos 4063。这种集成电路只能比较4位的数量,但是它提供了通过级联多个设备进行扩展的可能性

    如果您感兴趣的是自己实现它的逻辑,您可以查看数据表,其中有比较器逻辑图

    A : 010(1)1011 
    B : 010(0)1111 
    
    第一位移位

    C : 0
    D : 0
    

    如果它们匹配下一个整数的移位,如果它们不匹配,则返回两个整数中较大的一个:

    unsigned int a, b, max;
    max = ((~(a >= b)+1) & a) | ((~(b >= a)+1) & b);
    
    说明:假设一个整数是4字节。(a>=b)翻译成0001或0000。对于(b>=a)也一样。 在否定“~X+1”之后加上1将得到两者的补码。这样,比较中的1将转换为FFFF。0仍然是0000。 如果a=b,我们有:FFFF&a | FFFF&b=a。 如果a>b,我们有:FFFF&a | 0000&b=a。
    如果b>a,我们有:0000&a | FFFF&b=b.

    你是对的。实际上,您可以使用(左)移位寄存器来实现这一点,因此,例如,如果
    a
    B
    为8位,则首先使用
    00000001
    执行and,然后执行
    00000010
    ,依此类推。真正的问题是,例如,如果您使用64位,则需要以数据流的64倍频率处理数据。这反过来又限制了电路处理
    a
    s和
    数据流的最大频率