我们说我有以下字节:
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
我正在编写一个在0x0
和0xF
之间给出一个数字的函数。该数字应写入该字节的前4位。
示例:
void setByte(char value)
{
// ... ??
}
setByte(0xD) // 0xD = 00001101;
函数完成后,字节现在应如下所示:
11111101
我不知道我怎么能这样做 - 也许有可能&#34;复制&#34;最后4位进入另一个字节?
答案 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);