位操作的函数请路过朋友给解释一下

千分散尽还复来 2014-08-21 09:53:14
看到哈默斯利点集相关的东西,第一个就是位操作的,请路过朋友给解释一下。谢了,先。
float radicalInverse_VdC(uint bits)
{
bits = (bits << 16u) | (bits >> 16u);
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
return float(bits) * 2.3283064365386963e-10; // / 0x100000000
}
...全文
108 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookmill 2014-08-21
  • 打赏
  • 举报
回复
这个其实不难,在纸上画一画,或者单步调试一下,就明白了。 这种玩法用于极端要求速度和效率的场合,目的是避免循环。
brookmill 2014-08-21
  • 打赏
  • 举报
回复
bits = (bits << 16u) | (bits >> 16u); // 交换高16位和低16位 bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); // 所有单数位和相邻双数位互换 bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); // 2位为一组,相邻组互换 bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); // 4位为一组,相邻组互换 bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); // 8位为一组,相邻组互换 // 到此为止,实现按位反转,也就是0和31位互换,1和30位互换,……,15和16位互换 return float(bits) * 2.3283064365386963e-10; // / 0x100000000 // 这个不懂

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧