从n个数字数字数字中获取单个数字的最佳方法是什么?我想知道在C/C ++中是否有特别好的方法,如果不是什么,最好的解决方案是什么?

编辑:只是为了澄清,我一直在寻找一种解决方案,而不是将其转换为字符串并将其像对待一系列数字一样。

有帮助吗?

解决方案

使用大小的数字 2^k. 。提取 n数字:

#define BASE (2<<k)
#define MASK (BASE-1)

inline unsigned get_digit(unsigned word, int n) {
    return (word >> (n*k)) & MASK;
}

使用换档和掩码(通过基础为2的功率启用)避免了昂贵的整数范围说明。

之后,选择最佳基础是一个实验性问题(您特定硬件的时间/空间折衷)。大概 k==3 (基数8)效果很好,限制了水桶的数量,但是 k==4 (基础16)看起来更具吸引力,因为它划分了单词大小。但是,没有将单词大小划分的基础实际上没有错,您可能会发现32或基础64的表现更好。这是一个实验性的问题,可能会因硬件而有所不同,这是根据缓存的行为以及数组中有多少元素的方式而有所不同。

最后注意:如果您要排序 整数生活是一种更大的痛苦,因为您想将最重要的位视为签名。我建议将所有内容视为未签名,然后如果您真的需要签名,则在Radix排序的最后一步中,您将交换桶,因此,具有最重要1的存储桶是在最重要的0。 确实 如果更容易 k 划分单词大小。

其他提示

不要使用基本10,使用基础16。

for (int i = 0; i < 8; i++) {
    printf("%d\n", (n >> (i*4)) & 0xf);
}

由于整数在内部存储在二进制中,因此这将比除以10的效率更有效 小数 数字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top