【发布时间】:2014-04-15 19:14:29
【问题描述】:
我有一个函数可以反转字节中的位,但我不懂语法。为什么要用0x0802U & 0x22110U等二元运算(这个数字是多少)
unsigned char reverse(unsigned char B)
{
return (unsigned char)(((b * 0x0802U & 0x22110U) | (b * 0x8020U & 0x88440U)) * 0x10101U >> 16);
}
【问题讨论】:
我有一个函数可以反转字节中的位,但我不懂语法。为什么要用0x0802U & 0x22110U等二元运算(这个数字是多少)
unsigned char reverse(unsigned char B)
{
return (unsigned char)(((b * 0x0802U & 0x22110U) | (b * 0x8020U & 0x88440U)) * 0x10101U >> 16);
}
【问题讨论】:
查看“Bit Twiddling Hacks”页面了解说明:
用 7 次操作(非 64 位)反转字节中的位 http://graphics.stanford.edu/~seander/bithacks.html
【讨论】:
Direct link to the correct Bit Twiddling Hacks section.
你应该做数学来看看为什么选择这些数字。
abcd efgh
* 0000 1000 0000 0010
----------------------------------------------
0abc defg h00a bcde fgh0
& 0010 0010 0001 0001 0000
----------------------------------------------
00b0 00f0 000a 000e 0000
abcd efgh
* 1000 0000 0010 0000
----------------------------------------------
0abc defg h00a bcde fgh0 0000
& 0000 1000 1000 0100 0100 0000
----------------------------------------------
0000 d000 h000 0c00 0g00 0000
00b0 00f0 000a 000e 0000
| 0000 d000 h000 0c00 0g00 0000
----------------------------------------------
d0b0 h0f0 0c0a 0g0e 0000
* 0001 0000 0001 0000 0001
----------------------------------------------
d0b0 h0f0 dcba hgfe dcba hgfe 0c0a 0g0e 0000
>> and convert to 8-bits
----------------------------------------------
hgfe dcba
【讨论】: