English 中文(简体)
仅使用比特逻辑在二进制中查找两个整数的最大值
原标题:Finding the maximum of two integers in binary using bit logic only

这有点棘手,对于完成我认为的任务的人来说,这是一个很好的挑战。我搜索了以前问过的所有问题,但我找不到我想要的东西。

这里的目标是,在 < enger > binary < / strong > 上以 < enger > > binary 字写成的 < enger > < nger > < /strong > bits > 中,用每个整数的n位数(如果第一个整数最大,则结果为0,否则为1)来找到其中最大的一个,最终的目标是能够绘制一条电子电路,其中2*n bits将是有或没有紧张的电线,并将电线插在实际的电子部件中,以进行符合逻辑的操作。

我开始思考这个问题时意识到,无论发生什么(即,不管发生什么,n), 2n 大于 20 +... + 2(n-1) (从数学角度来说,这很容易找到) 。这意味着,无论多少整数都有一点(数k), 当其他整数中相应的位数为 0 时, s 值为 1, 而其他的位数在 n 和 k(所有位数在 k 左边) 之间是相同的, 最大 。 例如 :

A : 010(1)1011 is greater than B : 010(0)1111 with the significant bit in parentheses. All bits to its left are identical, and we don t have to care about the others.

So one can perform an exclusive OR (XOR) on all pairs of bits : the significant one would yield a 1, and then I can perform a NAND between corresponding bit of A with the result of that XOR, so that it d yield a 0 if A s k-th bit is a 1 and a 1 if it s B s k-th bit that is a 1. The only thing is ... what about the bits to the right of the significant one ? They can be different (thus also yielding a 1 when performing a XOR) but I have to ignore that ... Any ideas ?

问题回答

您需要硬件执行, 所以您最好将 A B 视为已签名的 N-bit 整数

  1. Invert B to its -B representation;
  2. Sum A to B with a N-bit Full Adder;
  3. Use the sign of the result as a selector variable of a 2-input, N-bit multiplexer.

当然,它只具有逻辑功能,才具有 " 强 " / " 强 " 的可表达性。

在第三点上,只需检查符号 S (1: 负, 0: 正) 即可满足前置 < code>B>A 。 因此,如果多oxxer对选择值 0 的输入为 A (对于选择值 1 的输入为 < code>B ),你就会得到你的结果。 在平等的情况下,您仍然选择 A , 但 < code> A=B , 这样您选择的输入在逻辑上是不相干的 。

作为 A 和 B 变量, 这是最明智的方法, 因为您可以重新使用添加器来添加。 我想, 检查最大值的具体案例的优化是可能的。

<强度 > 口头评论:

需要强调的是,逐步检查 A B 的每个数字的顺序执行在最坏的情况下需要 N 检查才能返回结果。如果 A 有两串数值,则必须保证能够跟上这些数值。因此,在 N 运行你最大()函数的逻辑比数据流的频率多。从另一个角度看,你需要放慢数据输入到最大()逻辑的速度。

相反,我建议的组合执行(或任何优化)与硬件资源交换速度。从其他角度讲,它能生成数据的速度要快到您能够生成数据 A B 的数据。 组合执行的传播延迟通常也高于相继执行,但这在频率方面不是一个问题。

两个大整数 :

unsigned int a, b, max;
max = ((~(a >= b)+1) & a) | ((~(b >= a)+1) & b);

Explanation: Let s assume an integer is 4 bytes. (a >= b) translates into either 0001 or 0000. The same for (b >= a). Adding 1 after a negation "~X + 1" gives the two s complement. This way the 1 from the comparison is converted into FFFF. The 0 remains 0000. If a = b we have: FFFF & a | FFFF & b = a. If a > b we have: FFFF & a | 0000 & b = a. If b > a we have: 0000 & a | FFFF & b = b.

我将在二进制的第二个操作员中加一个数字,然后在数字之一变成0之前,在这两个数字上(我们称之为“强”a

如果一个数字是 0,而另一个数字是 & gt; 0,您将拥有两个数字的最大值...

第一循环 :

a & 1 b & 1

第二循环 :

a & 10 b & 10

第三环 :

a & 100 b & 100

等一等... 等一等... And so on...

要检查一个数字在操作后是否等于零( 给定 n, 数字的长度为已知) 在最显著的 n+1 位置下, 数值为 n 乘以 0 + 1...

我的2分(也许是错误的)分:

对于您想要做的事情,有些IC是 IC, 其中一个例子是 cmos 4063。 这个IC 只能比较 4 位数, 但它允许通过一个以上的设备串联扩展 。

如果您感兴趣的是自己执行的逻辑,您可以查看数据表