如何写一个函数将0-15位复制到16-31?
unsigned int n = 10; // 1010
copyFromTo(n);
assert(n == 655370);
n = 5;
copyFromTo(n);
assert(n == 327685);
n = 134;
copyFromTo(n);
assert(n == 8781958);
答案 0 :(得分:2)
您想要复制0-15到16-31中的位。您应该理解,乘以2相当于将数字位移到左侧(移到更高位)。
如果您的号码为n
,n << 16
会将您的号码16位向左移。这相当于将n乘以2的16次幂,恰好是65536。
要复制这些位,并将原始位保留在0-15,命令n = n + (n << 16);
应该有效。但是,问题是(正如评论中所指出的),高位16-31位仍然在n +
项中设置。我们还需要清除这些位。请注意,65535对应于2 ^ 16 - 1,并且前0-15位为1,其他为0.所以正确的命令为n = (n && 65535) + (n << 16);
答案 1 :(得分:1)
这样做:
void copyFromTo(unsigned int& n)
{
n = (n & 0xffff) * 0x00010001;
}
答案 2 :(得分:0)
n&lt;&lt; 16位移位会做到这一点,将低位移到上位? (编辑)然后,只将低16位复制到其中