使用按位运算符或比较运算符对五个整数进行排序可以通过先获得最高数,然后是第二个最高数再到第三个来实现,依此类推。
以下是获取最高编号的代码:
#include <stdio.h>
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;
}
我认为使用这种方法可以得到第二,第三,第四和第五高的数字。
使用比较/按位运算符获取五个整数的中位数还有其他方法吗?任何其他组合方法都可能有效。
顺便说一下,我打算用硬件实现这个算法。
在排序中使用组合方法会很快而不是使用状态机。
答案 0 :(得分:2)
考虑它的一种方法是考虑5个数字之间的10个比较操作作为二进制输入。然后你有选择:
有些可能性永远不会发生,所以我确信可以进行一些简化。例如,如果(a> b)和(b> c)则(a> c)将始终为真。这将有助于方法#1并在方法#2中生成错误案例。
答案 1 :(得分:1)
五个整数中第三高的数字是中位数,所以如果你获得第三高的数字,你就可以了。
答案 2 :(得分:0)
更新
我使用排序网络在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提供想法。 =)