关于十六进制的问题

时间:2015-02-27 07:39:29

标签: hex

编写程序以交换整数中的奇数和偶数位。 对于exp,交换位0和位1,交换位2和位3。

解决方案使用0xaaaaaaa和0x55555555。 我能知道0xaaaaaaaa和0x55555555在二进制数字中的含义是什么吗?

1 个答案:

答案 0 :(得分:1)

每四位构成一个十六进制数字:

0000 0    1000 8
0001 1    1001 9
0010 2    1010 A
0011 3    1011 B
0100 4    1100 C
0101 5    1101 D
0110 6    1110 E
0111 7    1111 F

因此,例如,0x1234将为0001 0010 0011 01002

对于特定的示例:

0xaaaaaaaa = 1010 1010 ... 1010
0x55555555 = 0101 0101 ... 0101

解决方案可能会使用这两个值的原因是,如果你和一个0xaaaaaaaa的值,你只得到奇数位(从左边算起),你可以转移将它们移动到偶数位置的权利。

同样,如果您使用0x55555555和一个值,您只会获得偶数位,然后您可以向左移动它们以将它们移动到奇数位位置。

然后你可以将这两个值组合在一起并且这些位已被交换。

例如,让我们从16位值abcdefghijklmnop开始(每个字母为一位,零位为.以使其更具可读性):

      abcdefghijklmnop          abcdefghijklmnop
  AND 1.1.1.1.1.1.1.1.      AND .1.1.1.1.1.1.1.1
    = a.c.e.g.i.k.m.o.        = .b.d.f.h.j.l.n.p
>>1 = .a.c.e.g.i.k.m.o    <<1 = b.d.f.h.j.l.n.p.
      \___________                  ___________/
                  \                /
                   .a.c.e.g.i.k.m.o
                OR b.d.f.h.j.l.n.p.
                 = badcfehgjilknmpo

所以每组两位都被换掉了。在C中,这将是:

val = ((val & 0xAAAAAAAA) >> 1) | ((val & 0x55555555) << 1);

但是,如果这是一些描述的课堂作业,我建议你自己通过个人操作来解决这个问题。

有关允许您执行此操作的按位运算符的深入说明,请参阅this excellent answer here