基数排序 C++ 不屏蔽位
Posted
技术标签:
【中文标题】基数排序 C++ 不屏蔽位【英文标题】:Radix Sort C++ Not masking bits 【发布时间】:2012-03-09 05:19:39 【问题描述】:我有一个队列和一个队列数组。 buckets
是数组,collector
是队列。 pass
是一个整数,它保存了它的传递。我有一个方法可以返回队列的第一个单元格的包含,称为peek()
。 shiftOne()
是一种将一个队列的头部移动到另一个队列尾部的方法。
现在这段代码对我不起作用
bucket[((collector.peek()>>(pass * 8)) &0xFF)].shiftOne(collector);
我一步一步地走了,结果我没有正确地掩盖这些位。我可以改变它们,但仅此而已。所以我将尝试访问元素 102 以获得 10 元素数组。我究竟做错了什么?我知道peek()
和shiftOne()
,因为我可以使用幂和模数进行排序。
【问题讨论】:
8
和 0xFF
与使用 radix-256 排序一致,在这种情况下,您的数组应该是 256 个元素(访问元素 102 就可以了)
【参考方案1】:
您将基数 10 与基数 2 混淆了。
位移是除以 2,例如:102 >> 1
= 102 / 2
= 51。
类似地:102 >> 8
= 102 / 2^8
= 102 / 256
= 0(在int
术语中)。
例如代码(i >> 8) & 0xFF
用于提取给定i
值的第二个字节的内容。
对于您的情况 - 坚持使用模数除以 10。
【讨论】:
实际上,他一次移动 8 位,因此看起来像是混淆了 radix-256 和 radix-10。以上是关于基数排序 C++ 不屏蔽位的主要内容,如果未能解决你的问题,请参考以下文章