比较数字然后得到中值

使用按位或比较运算符对五个整数进行排序可以通过首先得到最高数,然后是第二高,然后是第三个来实现,依此类推。

以下是获取最高编号的代码:

#include  int main() { int a, b, c, d, e; int aa, bb, cc, dd, ee; a = 4; b = 2; c = 5; d = 1; e = 3; aa = (a > b) ? ((a > c) ? ((a > d) ? ((a > e) ? a : e) : ((d > e) ? d : e)) : ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e))) : ((b > c) ? ((b > d) ? ((b > e) ? b : e) : ((d > e) ? d : e)) : ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e))); printf("highest: %d\n", aa); return 0; } 

我认为使用这种方法可以得到第二,第三,第四和第五高的数字。

有没有其他方法使用比较/按位运算符获得五个整数的中位数? 任何其他组合方法可能是有效的。

顺便说一下,我将在硬件中实现这个算法。

在排序中使用组合方法将是快速而不是使用状态机。

考虑它的一种方法是考虑5个数字之间的10个比较操作作为二进制输入。 然后你有选择:

  1. 绘制10输入卡诺图并尽可能简化逻辑。
  2. 构建一个10位数作为表的索引。

一些可能性永远不会发生,所以我确信可以进行一些简化。 例如,如果(a> b)和(b> c)则(a> c)将始终为真。 这将有助于方法#1并在方法#2中生成错误案例。

五个整数的第三高中位数,所以如果你获得第三高的数字,你就可以了。

UPDATE

我使用排序网络在verilog中进行了组合排序。

 module comparator( input [31:0] a_1, input [31:0] b_1, output reg [31:0] a_0, output reg [31:0] b_0 ); always @(a_1, b_1) begin if (a_1 > b_1) begin a_0 = a_1; b_0 = b_1; end else begin a_0 = b_1; b_0 = a_1; end end endmodule module sorting_test; reg [31:0] a, b, c, d, e; wire [31:0] aa, bb, cc, dd, ee; reg clk; initial begin $dumpfile("sorting.vcd"); $dumpvars(); #10 $finish; end initial begin clk = 0; end always #1 clk = ~clk; initial begin a = 0; b = 0; c = 0; d = 0; e = 0; #1 a = 4; b = 1; c = 2; d = 5; e = 3; #1 a = 1; b = 16; c = 12; d = 14; e = 15; #1 a = 1; b = 4; c = 9; d = 19; e = 2; #1 a = 16; b = 11; c = 12; d = 16; e = 12; #1 a = 16; b = 17; c = 11; d = 15; e = 3; #1 a = 13; b = 9; c = 2; d = 1; e = 18; #1 a = 17; b = 3; c = 8; d = 3; e = 14; #1 a = 14; b = 10; c = 9; d = 14; e = 14; #1 a = 15; b = 12; c = 13; d = 10; e = 19; #1 a = 6; b = 8; c = 7; d = 16; e = 15; #1 a = 10; b = 17; c = 18; d = 1; e = 16; end wire [31:0] a1, b1, c1, d1, b2, c2, d2, e2, a2, b3, c3, d3, b4, c4, d4, e4, a5, b5, c5, d5; comparator c1l1( a, b, a1, b1); comparator c2l1( c, d, c1, d1); comparator c1l2(b1, c1, b2, c2); comparator c2l2(d1, e, d2, e2); comparator c1l3(a1, b2, a2, b3); comparator c2l3(c2, d2, c3, d3); comparator c1l4(b3, c3, b4, c4); comparator c2l4(d3, e2, d4, e4); comparator c1l5(a2, b4, a5, b5); comparator c2l6(c4, d4, c5, d5); assign aa = a5; assign bb = b5; assign cc = c5; assign dd = d5; assign ee = e4; endmodule 

@Steve Jessop感谢您提供信息。

致@David Winant和@sth提供想法。 =)