使用掩码仅更改一些位

时间:2019-06-16 10:30:42

标签: c bit-manipulation

我需要寻找正确的位掩码的帮助。 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 个答案:

答案 0 :(得分:1)

您可以在此处使用XOR

0x610b01100001

0xaa0b10101010

要将一个值转换为另一个值,只需将XOR0xCB0b11001011)一起使用:

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 = !AA XOR 0 = A

这里是演示:https://ideone.com/UIxPDV

答案 1 :(得分:1)

将任意仲裁位更改为另一个:

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);

答案 2 :(得分:0)

您是说newValue = (oldValue & 0xff00) | 0xaa;?或者您需要使用最少的面膜?如果是这样,请以二进制形式输入您的电话号码并进行检查。 :)