我正在尝试使用位操作创建一个char(8位),一次创建一个hex
。我正在运行的机器是小端。
所以无论如何,例如:
char buff;
buff = 0x54; // ('T')
printf(" %c \n", buff ); // prints T
buff |= 0x54; // Produces the same result.
buff |= 0x50 | 0x04; // Produces the same result.
但是我应该可以使用0x5
和0x4
进行位移来创建上述内容。
我试过
buff = ((buff << 4) | 0x4) | (buff | 0x5);
及其变体,但没有进展。我觉得我错过了一些简单的东西。
编辑:解决了。谢谢大家。我从来不知道你可以转移而不告诉它要转移什么*?
答案 0 :(得分:2)
您可以将这些步骤结合起来,但这里是分解:
char buff = 0x5; // set the upper nibble of the byte
buff <<= 4; // shift it over to the left
buff |= 0x4; // OR in the lower nibble
printf("%x\n", buff); // result here is 0x54
为什么你的版本不起作用:
buff = ((buff << 4) | 0x4) ... // start on the left, you shifted nothing
// (if we assume 0 was the starting value). So this
// is just going to be 0x4
buff = (0x4) | (buff | 0x5); // again, if we assume buff is 0 then this becomes 0x5
buff = 0x4 | 0x5; // (that's 0100 | 0101 which gives you 0x5)
答案 1 :(得分:1)
你似乎对移动的工作方式感到有些困惑,因为你试图在之前移动目的地或者:在一个非移位的常数中移动。
你只需要:
buff = (5 << 4) | 4;
将这些常量设为十六进制没有特别的意义,但当然因为它们每个都应该只有四位(一个十六进制数字),所以它有一定的意义,尽管它会使它更长:
buff = (0x5 << 4) | 0x4;
顺便说一句,“四位数据”的名称是a nibble(半个字节,得到它?),说“一个十六进制”没什么意义。
答案 2 :(得分:1)
代码不应在表达式中使用buf
的值,如下所示:
char buff = ((0x05 << 4) | 0x4);
请注意,上面的表达式是编译时常量,即((0x05 << 4) | 0x4)
计算由编译器执行,而不是由目标系统的CPU执行。
或者,你可以在几行上完成,如下所示:
char buff = 0x00;
buff |= 0x05;
buff <<= 4;
buff |= 0x04;
答案 3 :(得分:0)
上面的“buff”相当于:
buff = (0x5 << 4) | 0x4;
答案 4 :(得分:0)
将第一个数字向左移动4,然后用第二个数字移动
int first = 5;
int second = 4;
buff = (first << 4) | second;