如何设置十六进制数字? 我目前有这个代码:
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
答案 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
维基百科有更多关于按位操作的内容: