C ++按位左移32

时间:2016-12-03 19:06:29

标签: visual-studio-2015 bitwise-operators

目前,我正在研究背包问题的强力算法。一切都适用于小问题实例,例如15个项目。但是当我为更大的实例(如31或32)运行我的程序时,算法失败了。我遇到了逐位移位的问题,我用它来计算可能的解决方案的数量。例如,有10个项目,程序应该进行2 ^ 10次迭代,所以我使用这个语句:

unsigned long long int setCnt = (1 << 10);

计算值1024是正确的。但对于(1 << 31),计算值为18446744071562067968(最大unsigned long long int),但应为2147483648. (1 << 32)返回0.就像从0到30的所有工作正常一样位。

我使用Visual Studio 2015社区并在x64模式下编译我的解决方案。 是什么导致这种行为?我怎么能绕过这个呢?

1 个答案:

答案 0 :(得分:1)

问题是1signed int常量字面值 - 因此移位是signed int移位(显然只有32位,包括编译器上的符号) ,它溢出,导致未定义的行为。

尝试使用1ULL << 32(或您想要的任何其他班次金额) - ULL后缀使常量变为unsigned long long,与您所需结果的类型相匹配。如果移位量对于unsigned long long来说太大,这可能仍会溢出,但在此之前它会起作用。