关于十六进制的问题
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。
编写一个程序来交换整数中的奇数位和偶数位。 对于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。