64位掩码,为什么这些产生不同的结果?

时间:2018-09-08 04:03:10

标签: c++ bit-manipulation

我试图理解为什么bitMaskB不正确。它适用于除bitLength = 64以外的所有数字。我之所以用这种方式代替(1 << bitLength) - 1是因为支持bitLength = 64而不会使unsigned long long int溢出。

unsigned long long bitMaskA = ((1 << (bitLength - 1)) - 1)
                             + (1 << (bitLength - 1));

unsigned long long bitMaskB = 1 << (bitLength - 1);
                   bitMaskB = (bitMaskB - 1) + bitMaskB;

std::cout << bitMaskB           << std::endl; // 18446744069414584319
std::cout << bitMaskA           << std::endl; // 18446744073709551615
std::cout << 0xffffffffffffffff << std::endl; // 18446744073709551615

更新:

我改用(bitMaskB - 1) | bitMaskB解决了这个问题,但是我仍然想知道为什么会这样。

0 个答案:

没有答案