编写程序以交换整数中的奇数和偶数位。 对于exp,交换位0和位1,交换位2和位3。
解决方案使用0xaaaaaaa和0x55555555。 我能知道0xaaaaaaaa和0x55555555在二进制数字中的含义是什么吗?
答案 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。