关于位操作的一个函数烦请解释下

千分散尽还复来 2014-08-21 09:05:32
看到哈默斯利点集相关的东西,第一个就是位操作的,请路过朋友给解释一下。谢了,先。
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
}
...全文
293 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
AdrianHust 2014-08-22
  • 打赏
  • 举报
回复
第一步高地位互换, 后面的错位取 或,有点类似计算快速汉明距离
zilaishuichina 2014-08-22
  • 打赏
  • 举报
回复 1
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); 即为将bits 二进制的相邻每位的值互换
zilaishuichina 2014-08-22
  • 打赏
  • 举报
回复 1
首先一个bits 的二进制有32位 假设 bits 参数值为 0x12345678 bits = (bits << 16u) | (bits >> 16u); bits << 16 变成0x56780000 bits >> 16 变成0x00001234 bits << 16 | bits >> 16 变成 0x56781234,即高16位与低16位交换位置 bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); 0x55555555 是 0101,0101,0101,0101,0101,0101,0101,0101 0xAAAAAAAA 是 1010,1010,1010,1010,1010,1010,1010,1010 bits & 0x55555555 就是 取的bits 的二进制的奇数位, <<1,将二进制的奇数位变成二进制的偶数位 bits & 0xAAAAAAAA 就是 取的bits 的二进制的偶数位, >>1,将二进制的偶数位变成二进制的奇数位 ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u), 即为将bits 二进制的两相邻奇数位与偶数位的值互换,1、2互换,3、4互换,5、6互换,。。。31、32互换 以此类推 ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); 即为将bits 二进制的相邻每两位的值互换,例如(1,2)与(3,4)互换,(5,6)与(7,8)互换 bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u) 即为将bits 二进制的相邻每四位的值互换,例如(1,2,3,4)与(5,6,7,8)互换,(9,10,11,12)与(13,14,15,16)互换 bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); 即为将bits 二进制的相邻每四位的值互换,例如(1,2,3,4,5,6,7,8)与(9,10,11,12,13,14,15,16)互换 最后* 2.3283064365386963e-10这个我就不知道是一个参数还是什么了,不了解
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int v;
int bitrev1(const int b) {
    register int n;

    n=b;
    n=((n>> 1)&0x55555555)|((n<< 1)&0xaaaaaaaa);
    n=((n>> 2)&0x33333333)|((n<< 2)&0xcccccccc);
    n=((n>> 4)&0x0f0f0f0f)|((n<< 4)&0xf0f0f0f0);
    n=((n>> 8)&0x00ff00ff)|((n<< 8)&0xff00ff00);
    n=((n>>16)&0x0000ffff)|((n<<16)&0xffff0000);
    return n;
}
int bitrev2(const int b) {
    __asm {
        push ebx
        push ecx
        mov ebx,b
        mov ecx,32
    nextbit:
        rcl ebx,1
        rcr eax,1
        loop nextbit
        pop ecx
        pop ebx
    }
}
int bitrev3(const int b) {
    char bs[33],bs1[33],*ep;

    itoa(b,bs1,2);
    sprintf(bs,"%032s",bs1);
    strrev(bs);
    return strtol(bs,&ep,2);
}
void main() {
    v=0x12345678;//0001 0010 0011 0100 0101 0110 0111 1000
    printf("%08x\n",bitrev1(v));
    printf("%08x\n",bitrev2(v));
    printf("%08x\n",bitrev3(v));
}
//1e6a2c48
//1e6a2c48
//1e6a2c48

3,881

社区成员

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

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