设置特定字节的4位

时间:2015-12-28 18:05:22

标签: c++ binary bitwise-operators

我们说我有以下字节:

char* frame = new char[6];

这会导致:

00000000 00000000 00000000 00000000 00000000 00000000

现在我取第一个字节frame[0]并将其最后4位设置为:

frame[0] |= 1 << 7
frame[0] |= 1 << 6
frame[0] |= 1 << 5
frame[0] |= 1 << 4

现在的第一个字节:

11110000

我正在编写一个在0x00xF之间给出一个数字的函数。该数字应写入该字节的前4位。

示例:

void setByte(char value)
{
    // ... ??
}

setByte(0xD) // 0xD = 00001101;

函数完成后,字节现在应如下所示:

11111101

我不知道我怎么能这样做 - 也许有可能&#34;复制&#34;最后4位进入另一个字节?

2 个答案:

答案 0 :(得分:1)

设置nibble的技巧是首先清除所需的四位,然后清除新值中的OR。

使用0xF0掩码清除低位半字节;对于高位半字节,掩码为0x0F

char setLowerNibble(char orig, char nibble) {
    char res = orig;
    res &= 0xF0; // Clear out the lower nibble
    res |= (nibble & 0x0F); // OR in the desired mask
    return res;
}

char setUpperNibble(char orig, char nibble) {
    char res = orig;
    res &= 0x0F; // Clear out the upper nibble
    res |= ((nibble << 4) & 0xF0); // OR in the desired mask
    return res;
}

您可以按如下方式使用它:

frame[0] = setLowerNibble(frame[0], lowerNibbleOfFrame0);
frame[0] = setUpperNibble(frame[0], upperNibbleOfFrame0);

答案 1 :(得分:0)

以下示例通过交换两个半字节的示例显示了如何设置半字节:

制作原始字节的两个副本。

char orig = 'A';

char lower = orig;

char upper = orig;`

分别屏蔽上下半字节,并将其分别向相反的方向偏移4位。

lower &= 0x0F;
lower = lower << 4;

upper &= 0xF0;
upper = upper >> 4;

upper |= upper | lower;

最后一行通过合并两个半字节以产生交换的半字节来对两个数进行“或”运算。

测试字符为“ A”,以ASCII和65二进制01000001表示。两个半字节(0100和0001)交换将产生00010100,即十进制为20。

以下部分验证了答案:

printf("ans : %d",upper);