[问题] 请教一段奇怪的位反转函式

楼主: liwmewmew (如果大海能夠)   2018-02-26 15:41:37
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
我看到了一个奇怪的位反转程式
看他用for loop跑得很忙
但看一看感觉他实际效果只是将代入的x值往右shift一次
然后将第31位元开始的左边都滤掉,最后将结果喂给y去return
为何他不干脆简单的写return (x >> 1) & 4294967295就好了呢? 却要写得这么复杂?
(而且,这样的动作也不是位反转吧?...这函式如此命名,但一点注解都没有...)
请问我是不是误会了什么? 或是没注意到这function的真正意义?
真的非常谢谢各位
程式码(Code):(请善用置底文网页, 记得排版)
好读版: http://codepad.org/pzWWrf55
纯文字版:
unsigned long bitreverse(unsigned long x)
{
int i;
unsigned long y = 0;
for (i = 0; i < 32; i++) {
y <<= 1;
y |= (x >> (32 - i)) & 1;
}
return y;
}
补充说明(Supplement):
作者: asilzheng (asil)   2018-02-26 16:02:00
你人脑在跑程式时是不是忘了做for-loop?
作者: cutekid (可爱小孩子)   2018-02-26 16:10:00
y |= (x >> (31 - i)) & 1; 是不是要 31 - i 才对 ?
作者: Hazukashiine (私は幸せです)   2018-02-26 17:06:00
先不管哪样的写法是对的基本上这个 code 看到我就会先给一个大问号首先 hard-code 32 在程式码里面但是 unsigned long 并没有保证一定是 32-bit是不是应该用 uint32_t 或是用自定义 typedef?另外一件事这个 function 的名称: bitreverse给我的第一印象就是:“有这么多步骤吗?”我第一个直觉做 reverse 就是 x ^= ~(type)0;
作者: asilzheng (asil)   2018-02-27 00:02:00
你人脑在跑程式时是不是忘了做for-loop?
作者: cutekid (可爱小孩子)   2018-02-27 00:10:00
y |= (x >> (31 - i)) & 1; 是不是要 31 - i 才对 ?
作者: Hazukashiine (私は幸せです)   2018-02-27 01:06:00
先不管哪样的写法是对的基本上这个 code 看到我就会先给一个大问号首先 hard-code 32 在程式码里面但是 unsigned long 并没有保证一定是 32-bit是不是应该用 uint32_t 或是用自定义 typedef?另外一件事这个 function 的名称: bitreverse给我的第一印象就是:“有这么多步骤吗?”我第一个直觉做 reverse 就是 x ^= ~(type)0;
作者: sharkbay (Shark Bay)   2018-02-27 16:06:00
你是说 inverse 取反向Bit Twiddling Hacks喂狗看看
作者: Hazukashiine (私は幸せです)   2018-02-27 18:24:00
喔喔喔喔 我弄错了 感冒到脑子坏了
作者: sharkbay (Shark Bay)   2018-02-27 08:06:00
你是说 inverse 取反向Bit Twiddling Hacks喂狗看看
作者: Hazukashiine (私は幸せです)   2018-02-27 10:24:00
喔喔喔喔 我弄错了 感冒到脑子坏了

Links booklink

Contact Us: admin [ a t ] ucptt.com