Чтобы установить биты на 0, вы можете использовать битовое И с битовой маской:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AND 0000111111111111111111111111111111111111111111111111111111111111
--------------------------------------------------------------------
0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Чтобы установить биты на 1, вы можете использовать битовое ИЛИ с битовой маской:
0000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
OR 1000000000000000000000000000000000000000000000000000000000000000
-------------------------------------------------------------------
1000bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Обратите внимание, что int64
является целым числом со знаком и является результатом изменения старшего значащего бита побитовым и / или имеет результат, определенный реализацией (на практике это означает, что значение зависит от того, как отрицательные числа представлены в системе).Битовые операции обычно выполняются только с беззнаковыми целыми числами.
Создание самих битовых масок довольно сложно, если вам нужно, чтобы они были подписаны.Это связано с тем, что смещение влево положительного числа в непредставимый диапазон имеет неопределенное поведение.Лучше всего создать маску без знака и заново интерпретировать ее.
Предполагая, что вы на самом деле хотите использовать вместо нее без знака:
uint64_t input = whatever;
input &= 0x0FFFFFFFFFFFFFFFu;
input |= 0x8000000000000000u;
Битовые маски также можно сгенерировать с помощьюсдвиги, что является полезным способом обобщить операцию для целых чисел разных размеров:
using U = some_unsigned_integer;
U last_byte_offset = (sizeof(U) - 1) * 8;
U and_mask = ~(U(0xF0) << last_byte_offset);
U or_mask = U(0x80) << last_byte_offset;