使用按位运算创建char字符时出现问题

时间:2013-03-26 15:12:57

标签: c++ c bit-manipulation

我正在尝试使用位操作创建一个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&lt;&lt; 4 | 0x4” 如果我正确地解释它,它向左移动4,并设置0x5,然后设置为4? ** 没关系。迈克在下面解释了它做得彻底。非常感谢所有人。

5 个答案:

答案 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;