关于十六进制的问题

Questions about hexadecimal

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

解决方案使用0xaaaaaaaa和0x55555555。 我能知道 0xaaaaaaaa 和 0x55555555 在二进制数中是什么意思吗?

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

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 0100<sub>2</sub>.

对于您的具体示例:

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