C ++ побитовое смещение влево на 32
В настоящее время я работаю над алгоритмом грубой силы для задачи о ранце. Все отлично работает для небольших проблемных экземпляров, например, 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. Что вызывает это поведение? Как я могу обойти это?