gpt4 book ai didi

c++ - 给定一个无符号整数,很容易交换每个偶数位和奇数位。这可以概括为交换每个偶数和奇数 n 位吗?

转载 作者:行者123 更新时间:2023-11-30 05:02:53 25 4
gpt4 key购买 nike

在 n = 1 的情况下,如果我们有一个无符号的 32 位整数 i,交换后的整数将是

((i & 0xaaaaaaaa) >> 1) | ((i & 0x55555555) << 1)

当 n = 2

((i & 0xcccccccc) >> 2) | ((i & 0x33333333) << 2)

当 n = 4

((i & 0xf0f0f0f0) >> 4) | ((i & 0x0f0f0f0f) << 4)

等等。

如果 n 是 2 的任意次幂呢? ...并且,假设 i 是任意 128 位整数而不是 32 位整数,那么我们有 7 个案例而不是 5 个?

我怀疑有一种方法可以概括给定 n 的过程(即从 n 生成该掩码),如果有它就好了,这样我就不必在每个案例出现时都对它进行硬编码向上(例如,实现某些加密哈希函数——例如 JH)。

想到的明显方法是遍历潜在的掩码,在 n 较大的情况下迭代次数较少,但我宁愿有一种方法可以在常数时间内完成,操作较少。

一些应该适用于 32 位整数的东西,例如:

uint32_t mask = 0; submask = (2n) - 1;

for (uint32_t index = 0; index < 32; index += 2n)
{
mask |= submask;
submask <<= 2n;
}

有没有更好的方法来生成该掩码(最好没有循环)?

编辑:我刚刚想到,而不是

((i & 0xaaaaaaaa) >> 1) | ((i & 0x55555555) << 1)

你可以做

((i & 0xaaaaaaaa) >> 1) | ((i << 1) & 0xaaaaaaaa)

这将允许根本不需要使用倒置掩码。万一有人要查看此内容以供引用,那可能会很方便。

最佳答案

我认为这种方法效率更高一些。您可以存储或生成第一个掩码值。如果我的 c++ 不太正确,请原谅我,我更像是一个 php/javascript 程序员。此代码将依次生成所有掩码,因此您可以将它们保存到一个数组中,或者只是在您想要的掩码处停止循环:

uint32_t mask = 0xffffffff; // can perhaps use int32 and -1?
for (uint32_t i = 4; i >= 0; i--) {
mask ^= mask >> (1 << i);
cout << mask;
}

关于c++ - 给定一个无符号整数,很容易交换每个偶数位和奇数位。这可以概括为交换每个偶数和奇数 n 位吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com