目前,我正在研究背包问题的强力算法。一切都适用于小问题实例,例如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模式下编译我的解决方案。 是什么导致这种行为?我怎么能绕过这个呢?
答案 0 :(得分:1)
问题是1
是signed int
常量字面值 - 因此移位是signed int
移位(显然只有32位,包括编译器上的符号) ,它溢出,导致未定义的行为。
尝试使用1ULL << 32
(或您想要的任何其他班次金额) - ULL
后缀使常量变为unsigned long long
,与您所需结果的类型相匹配。如果移位量对于unsigned long long
来说太大,这可能仍会溢出,但在此之前它会起作用。