Очистить нижние 16 бит
Я не очень хорошо разбираюсь в побитовых операторах, поэтому, пожалуйста, извините за вопрос, но как бы я очистил нижние 16 бит 32-битного целого числа в C / C++?
Например, у меня есть целое число: 0x12345678, и я хочу сделать это: 0x12340000
6 ответов:
Чтобы очистить любой конкретный набор битов, вы можете использовать побитовое и с дополнением числа, которое имеет 1s в этих местах. В вашем случае, поскольку число 0xFFFF имеет свой нижний набор из 16 бит, вы можете и с его дополнением:
b &= ~0xFFFF; // Clear lower 16 bits.
Если вы хотите установить эти биты, вы можете вместо этого использовать побитовое или с числом, которое имеет эти биты:
b |= 0xFFFF; // Set lower 16 bits.
И, если вы хотите перевернуть эти биты, вы можете использовать побитовое XOR с числом, которое имеет эти биты набор:
b ^= 0xFFFF; // Flip lower 16 bits.
Надеюсь, это поможет!
Используйте и (
&
) с маской, которая состоит из верхних 16 бит все единицы (что оставит верхние биты, как они есть) и нижние биты все нули (что убьет нижние биты числа).Так и будет
0x12345678 & 0xffff0000
Если размер типа неизвестен, и вы хотите замаскировать только нижние 16 бит, вы также можете построить маску другим способом: используйте маску, которая пропускала бы только нижние 16 бит
0xffff
И инвертировать его с помощью побитового not (
~
), так что это станет маской, которая убивает только нижние 16 бит:0x12345678 & ~0xffff
Предполагая, что значение, которое вы хотите очистить от битов, имеет беззнаковый тип, а не "малый ранг", это самый безопасный и переносимый способ очистить нижние 16 битов:
b &= -0x10000;
Значение
-0x10000
будет повышено до типаb
(беззнаковый тип) с помощью модульной арифметики, в результате чего все старшие биты будут установлены, а младшие 16 бит равны нулю.Edit: На самом деле ответ Джеймса-самый безопасный (самый широкий случай использования) из всех, но способ, которым его ответ и мой обобщаются на другие подобные проблемы немного отличаются, и мои могут быть более применимы в смежных проблемах.