用位操作创建字符的问题

Problems creating a char character with bitwise operations

本文关键字:问题 字符 创建 位操作      更新时间:2023-10-16

我试图用位操作创建一个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.

但是我应该能够使用0x50x4的位移位来创建上面的。

我试过了

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

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

编辑:解决。

谢谢所有。我从来不知道你不告诉它要移动什么就可以移动*?

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

您可以将这些步骤组合起来,但下面是分解:

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("%xn", 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)

您似乎对如何移动工作感到有点困惑,因为您试图在未移位的常量之前或中移动目的地。

你只需要:

buff = (5 << 4) | 4;

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

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

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

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

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

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

或者,您可以在几行中执行,如下所示:

char buff = 0x00;
buff |= 0x05;
buff <<= 4;
buff |= 0x04;

相当于你上面的"buff"是:

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

将第一个数字左移4,然后用第二个

 int first = 5;
 int second = 4;
 buff = (first << 4) | second;