设置特定字节的 4 位

Set 4 bits of a specific byte

假设我有以下字节:

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

我不确定我该怎么做 - 也许可以 "copy" 最后 4 位到另一个字节?

设置nibble的诀窍是先清除所需的四位,然后在新值中进行或运算。

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

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

复制两个原始字节。

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