2

我正在尝试使用位操作创建一个字符(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);

及其变体,但没有进展。我觉得我错过了一些简单的东西。

编辑:解决。

谢谢大家。我从来不知道你可以在不告诉它要改变什么的情况下改变*?

  • 可能对“buff = 0x5 << 4 | 0x4”没有完全理解如果我正确解释它,它会向左移动 4,并设置 0x5,然后 OR 与 4?** 没关系。下面的迈克彻底解释了它的作用。非常感谢大家。
4

5 回答 5

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)
于 2013-03-26T15:16:58.713 回答
1

您似乎对移位的工作原理有些困惑,因为您试图在 or:ing 非移位常量之前移位目的地。

您只需要:

buff = (5 << 4) | 4;

将这些常量设为十六进制并没有什么特别的意义,但当然,由于它们每个都应该只有四位(一个十六进制数字),尽管它会更长一些,但它是有道理的:

buff = (0x5 << 4) | 0x4;

顺便说一句,“四位数据”的名称是半字节(半字节,明白吗?),说“一个十六进制”没有什么意义。

于 2013-03-26T15:15:50.100 回答
1

代码不应buf在表达式中使用 的值,如下所示:

char buff = ((0x05 << 4) | 0x4);

请注意,上面的表达式是一个编译时常量,即((0x05 << 4) | 0x4)计算是由编译器执行的,而不是由目标系统的 CPU 执行的。

或者,您可以在几行上执行此操作,如下所示:

char buff = 0x00;
buff |= 0x05;
buff <<= 4;
buff |= 0x04;
于 2013-03-26T15:15:56.880 回答
0

然后将第一个数字向左移动 4 或与第二个数字一起移动

 int first = 5;
 int second = 4;
 buff = (first << 4) | second;
于 2013-03-26T15:16:30.350 回答
0

相当于你上面的“buff”将是:

buff = (0x5 << 4) | 0x4;
于 2013-03-26T15:15:48.277 回答