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

千分散尽还复来 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
}
...全文
351 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
已经博主授权,源码转载自 https://pan.quark.cn/s/8f7d9b77a9d1 微信小程序是一个轻量级的应用开发平台,主要面向移动设备,由腾讯公司推出,其目的是提供一种便捷的应用体验,用户无需下载安装即可直接使用。"你画我猜"是一种广受欢迎的游戏模式,参与者通过绘画来传达一个词语或短语,其他参与者则根据所见的图画来猜测其含义,这种互动性突出且趣味盎然的模式非常适合在微信小程序平台上实现。在"微信小程序你画我猜游戏demo完整源码"这一资源中,我们可以学习到以下几个核心知识点:1. **微信小程序开发环境的构建**:开发者需要安装微信开发者工具,这是进行微信小程序编写与调试的基础。该工具集成了代码编辑、预览、调试等多种功能,为开发者提供了便利的项目开发条件。2. **WXML与WXSS**:WXML是微信小程序的结构性语言,类似于HTML,用于定义页面的结构与布局;WXSS是微信小程序的样式性语言,类似于CSS,负责控制页面的外观。开发者必须熟练掌握这两种语言的语法和特性,以便创建既美观又功能齐全的界面。3. **JavaScript的业务逻辑处理**:在微信小程序中,JavaScript主要承担数据绑定、事件处理以及API调用的职责。通过`Page`对象,开发者可以设定每个页面的数据、生命周期事件和方法,从而实现复杂的业务逻辑。4. **微信小程序API的应用**:此游戏demo会运用到微信小程序提供的多种API,包括用户身份验证、网络请求、画板绘图、动画效果等。例如,`wx.createContext()` API可用于获取绘图环境,实现画板功能;`wx.request()`则用于与服务器进行交互,获取游戏数据或提交玩家的绘画作品。5. **游戏逻辑的...

3,881

社区成员

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

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