我有两个32位整数HI& LO,我需要右移它们中的位,以便HI的最后一位成为LO的最高位。换句话说,移位操作应该起作用,好像两个比特是一个64比特单元。语言C / C ++
谢谢 !
答案 0 :(得分:1)
下面的代码如您所述右移1位。
它的作用是屏蔽除hi
中的最低位以外的所有位置,并将其一直向左移位(最高有效位),并将其与lo
一起向右移位一位。
然后,它只是将hi
转移到右边一位。
{
lo = ((hi & 0x00000001)<<31) | (lo >> 1);
hi = hi >> 1;
}
答案 1 :(得分:1)
如果你的C有一个long long
(64位)类型,那么最好使用它,但是如果你需要分两半进行,那么它就像这样进行逻辑移位
LO = HI & 1 ? ( LO >> 1 ) | 0x80000000 : ( LO >> 1) & 0x7FFFFFFF;
HI = ( HI >> 1 ) & 0x7FFFFFFF;
右移数字的结果取决于您正在处理的平台:它可能会也可能不会扩展符号位。这段代码可以满足这两种可能性。
答案 2 :(得分:1)
如果您的编译器支持long long
类型(即64位整数),您可以执行以下操作:
unsigned long long joined = (((unsigned long long)hi) << 32) | lo;
joined >>= 1;
uint32_t new_low = (uint32_t)joined;
任何体面的编译器都会识别 concat模式,它通常不会生成任何代码。移位会生成一个或多或少的最佳序列,最终的演员阵容通常也不会生成任何代码。