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