位以十六进制翻转

时间:2010-05-31 04:36:51

标签: language-agnostic bit-manipulation hex

我有一个8位十六进制数,其中我需要某些数字为0或f。鉴于数字的具体位置有一个快速的方法来生成十六进制数字,这些地方“翻转”到f。例如:

flip_digits(1) = 0x000000f
flip_digits(1,2,4) = 0x0000f0ff 
flip_digits(1,7,8) = 0xff00000f 

我在嵌入式设备上这样做,所以我不能调用任何数学库,我怀疑它只能通过位移来完成,但我无法弄清楚方法。任何类型的解决方案(Python,C,伪代码)都可以使用。提前谢谢。

2 个答案:

答案 0 :(得分:4)

您可以定义八个命名变量,每个变量都有一个给定的半字节设置所有位:

unsigned n0 = 0x0000000f;
unsigned n1 = 0x000000f0;
unsigned n2 = 0x00000f00;
unsigned n3 = 0x0000f000;
unsigned n4 = 0x000f0000;
unsigned n5 = 0x00f00000;
unsigned n6 = 0x0f000000;
unsigned n7 = 0xf0000000;

然后你可以使用按位 - 或组合它们:

unsigned nibble_0 = n0;
unsigned nibbles_013 = n0 | n1 | n3;
unsigned nibbles_067 = n0 | n6 | n7;

如果要在运行时将它们组合在一起,最好将常量存储在数组中,以便更容易访问它们(例如,n[0] | n[6] | n[7])。

答案 1 :(得分:4)

result = 0
for i in inputs:
  result |= 0xf << ((i - 1) << 2)