Очистить нижние 16 бит


Я не очень хорошо разбираюсь в побитовых операторах, поэтому, пожалуйста, извините за вопрос, но как бы я очистил нижние 16 бит 32-битного целого числа в C / C++?

Например, у меня есть целое число: 0x12345678, и я хочу сделать это: 0x12340000

6 6

6 ответов:

Чтобы очистить любой конкретный набор битов, вы можете использовать побитовое и с дополнением числа, которое имеет 1s в этих местах. В вашем случае, поскольку число 0xFFFF имеет свой нижний набор из 16 бит, вы можете и с его дополнением:

b &= ~0xFFFF; // Clear lower 16 bits.

Если вы хотите установить эти биты, вы можете вместо этого использовать побитовое или с числом, которое имеет эти биты:

b |= 0xFFFF; // Set lower 16 bits.

И, если вы хотите перевернуть эти биты, вы можете использовать побитовое XOR с числом, которое имеет эти биты набор:

b ^= 0xFFFF; // Flip lower 16 bits.

Надеюсь, это поможет!

Чтобы выбрать другой путь, вы можете попробовать

x = ((x >> 16) << 16);

Одним из способов было бы побитовое и оно с 0xFFFF0000, например value = value & 0xFFFF0000

Используйте и (&) с маской, которая состоит из верхних 16 бит все единицы (что оставит верхние биты, как они есть) и нижние биты все нули (что убьет нижние биты числа).

Так и будет

0x12345678 & 0xffff0000

Если размер типа неизвестен, и вы хотите замаскировать только нижние 16 бит, вы также можете построить маску другим способом: используйте маску, которая пропускала бы только нижние 16 бит

0xffff

И инвертировать его с помощью побитового not (~), так что это станет маской, которая убивает только нижние 16 бит:

0x12345678 & ~0xffff
int x = 0x12345678;
int mask = 0xffff0000;

x &= mask;

Предполагая, что значение, которое вы хотите очистить от битов, имеет беззнаковый тип, а не "малый ранг", это самый безопасный и переносимый способ очистить нижние 16 битов:

b &= -0x10000;

Значение -0x10000 будет повышено до типа b (беззнаковый тип) с помощью модульной арифметики, в результате чего все старшие биты будут установлены, а младшие 16 бит равны нулю.

Edit: На самом деле ответ Джеймса-самый безопасный (самый широкий случай использования) из всех, но способ, которым его ответ и мой обобщаются на другие подобные проблемы немного отличаются, и мои могут быть более применимы в смежных проблемах.