在C中的两个寄存器之间移位

时间:2012-02-27 19:47:28

标签: c bit-manipulation

我有两个32位整数HI& LO,我需要右移它们中的位,以便HI的最后一位成为LO的最高位。换句话说,移位操作应该起作用,好像两个比特是一个64比特单元。语言C / C ++
谢谢 !

3 个答案:

答案 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模式,它通常不会生成任何代码。移位会生成一个或多或少的最佳序列,最终的演员阵容通常也不会生成任何代码。