设置十六进制数字的数字

时间:2011-05-14 11:24:37

标签: c++ c bitwise-operators

如何设置十六进制数字? 我目前有这个代码:

int row = 0x00000000;
row |= 0x3 << 8;
row |= 0x2 << 4;
row |= 0x1 << 0;

printf("Row: 0x%08x", row);

只要“行”只是零,这就完美无缺。一旦我将其改为这样的东西:

int row = 0x33333333;
row |= 0x3 << 8;
row |= 0x2 << 4;
row |= 0x1 << 0;

printf("Row: 0x%08x", row);

我得到这个输出:

  

行:0x33333333

2 个答案:

答案 0 :(得分:10)

您应该先删除(将其设为0)数字。

row &= ~(0xf << 4);

~运算符会反转数字中所有位的值。所以。 0x000000f0变为0xffffff0f

您的代码应如下所示:

row &= ~(0xf << 8);
row |= 0x3 << 8;
row &= ~(0xf << 4);
row |= 0x2 << 4;
row &= ~(0xf << 0);
row |= 0x1 << 0;

答案 1 :(得分:3)

正如Alexandru解释的那样,在进行设置之前,您需要清除您尝试设置的位域。

为了进一步评论为什么你的代码没有做你想做的事情,考虑在二进制级别变量发生了什么:

row |= 0x2 << 4;

| = 运算符是“按位或”。因此,如果您尝试设置的位或您传入的位设置为1,则结果为1.在您的代码中,设置为0x33333333,因此每个4位十六进制数字是二进制的 0011 。按位或 0x2 时,得到0x3:

/* 0x3 | 0x2 = 0x3 */
0011 | 0010 = 0011

如果先清除位域,则得到0x2,这就是你想要的:

/* 0x3 | 0x0 = 0x0 */
0011 | 0000 = 0000

/* 0x0 | 0x2 = 0x2 */
0000 | 0010 = 0010

请注意,使用移位和按位操作的数据操作不太可能在不同平台之间移植。尝试运行代码依赖于不同字节的机器上的位移,或者如果您尝试在64位机器上运行在32位机器上运行的代码时,可能会遇到问题:

http://www.viva64.com/en/a/0004/#ID0EQFDI

维基百科有更多关于按位操作的内容:

http://en.wikipedia.org/wiki/Bitwise_operation