双比特运算的算术运算

时间:2011-04-18 13:44:43

标签: c++ math bit-manipulation

有一些明显的东西,我觉得我应该在这里理解,但我不知道:

void main()
{
    long first = 0xffffffc1;
    long second = 0x92009019;

    //correct
    __int64 correct = (((__int64)first << 32) | 0x00000000ffffffff) & (0xffffffff00000000 | second); //output is 0xffffffc192009019;

    //incorrect
    __int64 wrong = (double)(((__int64)first << 32) + second); //output is 0xffffffc092009019;
}

为什么添加操作会影响高4字节,以及如何影响?

(编译器是VC ++ 2003)

2 个答案:

答案 0 :(得分:4)

可能是因为second已签名,这意味着0x92009019为负。

编辑:问题实际上包含两个问题。

1)如何将两个32位数加入64位值?

答案:

(((uint64_t)first) << 32) | (uint32_t)second

2)使用浮点类型double进行位操作是否明智?

答案:不,不是。请使用正确的工具进行工作。如果要进行位操作,请使用整数。如果您想要(几乎)连续值,请使用浮点值。

答案 1 :(得分:3)

long有53位精度。我很惊讶你得到了最后的数字。 (第一个错误的数字由Lindydancer解释)。

编辑:我不再感到惊讶:因为结果是否定的,你的数据不需要38位精度。如果你使用

first = 0xffdfffc1;

你正在用双重解决方案失去lsb。