我试图理解为什么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
解决了这个问题,但是我仍然想知道为什么会这样。