Очистить младшие 16 бит - PullRequest
6 голосов
/ 29 июля 2011

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

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

Ответы [ 6 ]

15 голосов
/ 29 июля 2011

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

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

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

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

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

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

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

4 голосов
/ 29 июля 2011

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

x = ((x >> 16) << 16);
2 голосов
/ 29 июля 2011

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

1 голос
/ 29 июля 2011

Предполагая, что значение, из которого вы хотите очистить биты, имеет тип без знака, не имеющий «маленького ранга», это самый безопасный и наиболее удобный способ очистки 16 младших битов:

b &= -0x10000;

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

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

1 голос
/ 29 июля 2011
int x = 0x12345678;
int mask = 0xffff0000;

x &= mask;
1 голос
/ 29 июля 2011

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

Так будет

0x12345678 & 0xffff0000

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

0xffff

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

0x12345678 & ~0xffff
...