2012-05-29 4 views
1

У меня есть битовая маска (хранится как короткая). Для различных целей я хочу обнулить все, кроме последних 5 бит - я уверен, что есть простой способ сделать это с помощью побитовых операторов, но он ускользает от меня.последние 5 бит битмаски

1010 01101 1011 0111 -> 0000 0000 0001 0111 

Благодаря

+2

Спасибо всем за вашу помощь – Prescott

+0

Запомни/Респект !!! Teh порядок байтов Независимо от того, что они вам скажу;) – Jay

ответ

7

использовать что-то вроде:

x & 0x1f 

В двоичной, ваш пример будет:

1010 1101 1011 0111 
    & 0000 0000 0001 1111 
    --------------------- 
    0000 0000 0001 0111 

При использовании оператора &, 0 бит в результате маски в 0 бит в результате. 1 бит в маске копирует соответствующие биты в результат.

+0

Так как тип очень хорошо может быть сохранен в PDP-Endian, я голосую за то, что не дал совета для выполнения двоичных операций в соответствии с принципами, хотя это может включать здравый смысл. Несмотря на то, что вы представили двоичный пример, вы могли бы также показать и сказать очевидное. – Jay

+0

@Jay: Побитовые логические операции не зависят от сущности. Endianness только делает разницу, когда значения хранятся в памяти - как только они загружаются в регистры CPU, нет никакой разницы. Ваше возражение велико. –

+0

Как я уже сказал ниже ... его пример загружен в память, поэтому ... «Последнее может быть истинным, но ваш пример смещается из загруженной памяти, следовательно, используется адрес обозначений: P ' – Jay

-1

Что-то вроде этого:

your_variable_name & ((1 << 5) - 1) 

(1 < < 5) - 1 даст вам 11111, а затем и с значением.

+0

да, а также приоритет оператора был испорчен , исправлены оба. –

+0

@Jay: нет, это не так. Не в этом дело. – Borodin

+0

Хорошо, поскольку var недействителен в CI, предполагалось, что происходит автоматическое преобразование, и что размер указателя не был размером с int по какой-то странной причине, но я мог бы просто удалить мой комментарий: p Тем не менее спасибо за указав его – Jay

-1

Просто двигая ее влево, затем вправо должен сделать это ... int x= 5; x <<= 5; x >>= 5;

или наоборот в зависимости от edianess.

Вы также можете применить маску, где последние 5 битов 1, такие как 0x1f

+1

(1) Ваш счетчик смены не будет " t be 5, это будет зависеть от количества бит в 'int'.(2) Обязательно используйте * unsigned * right shift, иначе вы получите расширение знака. –

+0

Кроме того, C не имеет неподписанных операторов сдвига ... http: //en.wikipedia.org/wiki/Circular_shift ... это конкретная реализация, если тип не имеет знака ... http://stackoverflow.com/questions/ 7622/shift-operator-in-c – Jay

+0

Кроме того, если вы использовали Java, sizeof int был бы зафиксирован на 4 байта или 32 бита ... – Jay

0

Value = OriginalValue & 0x1F

+0

Endianess ....... – Jay

+0

Что с этим делать? Переменные и литералы не будут отличаться? –

Смежные вопросы