一种奇怪的三数排序算法

上个学期末刚刚做完计算机组成原理实验。其中有一个课题是设计一个三数排序程序。实验用的单片机只能顺序执行语句,所以想出了这个十分麻烦的方法来排序。

设这三个数为A、B和C。
先用A减B。如果B比A大的话,那么差的第一位就会是1。由于我们比较的是15以下的数,所以正常情况下第一位不会是1。我们将B与A的差和8000(16)按位相与。如果A比B小的话,我们会得到8000(16);如果A比B大的话,我们会得到0000(16)。
同理,我们将这三个数分别与其余两个数将比较,将得到的两个差加起来。最大的一个数由于两次的差都为0000,所以两差之和为0000;次大的一个数一次得到的差为8000,一次得到的差为0000,所以两差之和为8000;最小的一个数两次的差都为8000,两差相加由于溢出最后的和还是0000。我们将这三个和左移一位之后取反加1。最大和最小的数都得到了0000,只有中间那个数得到了FFFF。我们将这个结果记为δ。
我们将要存入排序好的数的内存单元分别称为RAM1、RAM2和RAM3。这三个内存单元分别存入最大、次大和最小的数。我们令RAM2等于这三个数分别与各自得到的δ按位相与得到的结果的和。由于最大的数和最小的数和各自的δ按位相与得到的结果均为0,只有次大的那个数得到的结果为自己本身,所以RAM2就存入了中间那个数。
然后我们将这三个数和各自的δ的反按位相与。这样最大的数和最小的数还是它本身,只有次大的那个数变成了0。这样一来最小的那个数就变成了第二大的数。我们重复上面的步骤并将最后的结果存入RAM3。
这次之后,最大的数的δ为0000,0(本应是次大的数)的δ为0000,最小的那个数的δ为FFFF。再将各自的δ按位取反,这样一来最大的数和0的δ变为了FFFF,最小的数的δ成了0000。
我们再将这三个数和各自的δ的按位相与。这样最大的数还是它本身,而次大的数和最小的数都变成了0。我们将这三个数的和存入RAM1完成了排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值