битовая манипуляция — побитовые (Bitshift) операции над 64-битными целыми числами в переполнении стека

Я пытаюсь разобраться с битбордами, что требует от меня установки определенного бита в 64-битном целом числе без знака. Установить бит я, Я выполняю побитовое ИЛИ с рассматриваемой битовой доской со смещенным влево числом.

#include <stdint.h>
uint64_t kings = 0ULL; // Also tried unsigned long long int before.
kings |= 1 << i;

Он отлично работает от 0 до 31, но не работает с 32 по 63. Я подозреваю, что это потому, что оценка правой стороны происходит в 32-разрядном целом числе. Поэтому я попробовал временную переменную.

uint64_t temp = 0ULL;
temp |= 1 << i;

Возможно, он по-прежнему оценивает правую часть как 32-разрядное целое число или что это другая проблема, которую я не могу понять. Для вывода целого числа я использую std :: bitset<64>. Например:

uint64_t kings = 0ULL;
kings |= 1 << 3;
kings |= 1 << 59;

Ожидаемое десятичное значение: 576460752303423496

Актуально: 8

std::bitset<64> x(kings);
std::cout << x;

Значение бита: 0000000000000000000000000000000000000000000000000000000000000000000000001000

Понятно, что только короли | = 1 << 3; работал правильно.

Таким образом, что является проблемой с битами с 32 по 63 и как я могу обойти это?

4

Решение

Вам нужно использовать 1LL как 64-битное значение, прежде чем использовать сдвиг operator << чтобы получить 64-битный результат:

#include <stdint.h>
uint64_t kings = 0ULL;
kings |= 1ULL << i;
9

Другие решения

В чем проблема с битами с 32 по 63?

Литерал 1 имеет тип int, Тип результата оператора сдвига — это тип его LHS (после того, как на нем были выполнены обычные арифметические преобразования). В вашей реализации он выглядит 32-битным, поэтому его смещение более чем на 31 бит приводит к неопределенному поведению.

Используйте 64-разрядное целое число в качестве левого операнда оператора сдвига:

temp |= static_cast<uint64_t>(1) << i;
4

Вам нужно сдвинуть 64-битное целое число:

kings |= 1i64 << 59;
3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector