Изменение только некоторых битов с маской - PullRequest
0 голосов
/ 16 июня 2019

Мне нужна помощь в поиске правильной битовой маски.0xbc61 должно быть 0xbcaa, но я не уверен, как создать битовую маску, чтобы повлиять только на часть, которую я должен изменить.Я также попытался разделить значение, но не был уверен, как «склеить» их с новым ...

unsigned short int left, right;
unsigned short int temp = 0xbc61;
unsigned short int newValue = 0xaa;
right= temp & 0xff; // split
left= (temp >> 8) // split

// temp needs to be 0xbcaa
// and I also need it the other way round, so 0xbc61 -> 0xaa61

Ответы [ 3 ]

1 голос
/ 16 июня 2019

Вы можете использовать XOR здесь:

0x61 равно 0b01100001

0xaa равно 0b10101010

Чтобы преобразовать одно значение в другоепросто используйте XOR с 0xCB (0b11001011):

unsigned short mask = 0xbc61;
....
// convert to new mask 0xbcaa
mask ^= 0xCB; // mask now is 0xbcaa
...
// convert back to 0xbc61
mask ^= 0xCB; // mask now is 0xbc61

ПРИМЕЧАНИЕ : A XOR 1 = !A и A XOR 0 = A

Вот демо:https://ideone.com/UIxPDV

1 голос
/ 16 июня 2019

для изменения любых произвольных битов на другие:

uint32_t changebits(uint32_t val, uint32_t mask, uint32_t newvalue)
{
    val &= ~mask;
    val |= (newvalue & mask);
    return val
}

 changebits(0xe323da98, 0b00000110011000010100000100000000, 0xde45ab67);

он установит только биты, заданные вторыми параметрами, в те же биты из третьего параметра.

в вашем случае

changebits(0xbc61, 0xff, 0xaa);
0 голосов
/ 16 июня 2019

Вы имеете в виду newValue = (oldValue & 0xff00) | 0xaa;?Или вам нужно использовать минимальную маску?Если это так, напишите свой номер в двоичном виде и проверьте его.:)

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