Как решить эту битовую операцию? - PullRequest
1 голос
/ 28 января 2011

У меня есть один байт, мне нужно заменить последние (наименее важные) биты.Пример ниже.

Original byte:      xxxx0110
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx1111
Replacement byte:       0000
What I want to get: xxxx0000

Original byte:      xxxx0000
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx1010
Replacement byte:       1111
What I want to get: xxxx1111

Original byte:      xxxx0101
Replacement byte:       0111
What I want to get: xxxx0111

Ответы [ 4 ]

7 голосов
/ 28 января 2011
 value = (byte)( (value & ~15) | newByte);

~15 создает маску всего , за исключением последних 4 битов; value & {that mask} забирает последние 4 бита, затем | newByte помещает биты из новых данных на их место.

4 голосов
/ 28 января 2011

Это можно сделать с помощью комбинации побитового И, чтобы очистить биты, и побитового ИЛИ, чтобы установить биты.

Чтобы очистить младшие четыре бита, вы можете И со значением 1 везде, кромете биты, где это ноль.Одним из таких значений было бы ~0xF, которое является дополнением к 0xF, а это четыре значения: 0b1111.

Для установки битов вы можете использовать битовое ИЛИ с битами для установки,Начиная с 0 OR x = x, это работает так, как вы и хотели.

Чистый результат будет

(x & ~0xF) | bits

РЕДАКТИРОВАТЬ: Согласно комментарию Иона Нербонна, вы должны затем привести обратно к byte:

(byte)((x & ~0xF) | bits)
0 голосов
/ 28 января 2011

Если мое понимание верно, вы хотите ИЛИ свой байт (после сдвига влево 4 раза) с заменяющим байтом (сдвиг влево также 4 раза). Затем сдвиньте вправо 4 раза, и вы получите желаемый результат.

Например: а = 1001 1101 Запасной байт: 0000 1011

Сдвиг влево 4 раза: 1101 0000 Замена левого смещения 4 раза: 1011 0000

ИЛИ результат: 1111

Сдвиг вправо 4 раза: 1011 (конечный результат).

Может быть, эта ссылка полезна: http://www.codeproject.com/KB/cs/leftrightshift.aspx

0 голосов
/ 28 января 2011

trim последние 4 бита. и append новые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...