映射表操作中的常用数组
来源:互联网 发布:p2p网络投资理财 编辑:程序博客网 时间:2024/05/01 02:34
1.代码
#define calc_clr_min_seted(m) (m&(m-1)) /*置0最小位的1*/#define calc_set_min_clred(m) (m|(m+1)) /*置1最小位的0*/const unsigned char cn8s_nearest_seted_in_tbl[256]={/*二进制第一个1所在的位置*/ 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,};const unsigned char cn8s_nearest_clred_in_tbl[256]={/*二进制第一个0所在的位置*/ 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5, 0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8,};const unsigned char cn8s_seted_count_tbl[256]={/*二进制中1的数量*/ 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
二、思路
以空间换时间,加快对映射区的操作
三、应用场景举例
[映射区] _u8_map;
[数据区]_u8s_data[8][xx];
现在有一个 包含了映射区和数据区的映射表,其中数据区中的某几个字节对应映射表中的某1位,假设映射区长度为1Byte,则可以映射8个区块。
1.我想找到数据区中使用了几个块,即映射区中有几个1:
uint8 count= cn8s_seted_count_tbl[_u8_map];
2.我想找到数据区中第1个空闲的块:
uint8 index= cn8s_nearest_clred_in_tbl[_u8_map];
3.我想枚举数据区中的所有已使用的块
uint8 val = _u8_map;uint8 index;while( val ){ index = cn8s_nearest_seted_in_tbl[val]; /*得到第一个已使用块的位置*/ /* TODO... */ /*去掉最小的那个1 例:0110 -> 0100*/ val = calc_clr_min_seted(val);}
0 0
- 映射表操作中的常用数组
- 数组中的常用操作函数
- 类库中的常用的操作数组的方法
- js 常用数组操作
- 数组的常用操作
- JavaScript数组常用操作
- js 数组常用操作
- 数组常用操作
- php数组常用操作
- ruby 数组常用操作
- Java数组常用操作
- JavaScript数组常用操作
- 数组常用操作
- javascript数组常用操作
- 数组的常用操作
- js 数组常用操作
- javascript数组常用操作
- Jquery常用数组操作
- 18. 4Sum
- EventBus代替Intent将复杂对象传递给下一个即将启动的Activity
- java io基础
- 机房重构——泛型 or DataTable?
- OPENCV常用小代码
- 映射表操作中的常用数组
- 自定义Cell的Button无法点击
- 极客DIY:用树莓派制作低成本高清监控摄像机
- 帝国cms循环列出所有子栏目名,和当前子栏目下的文章列表和所有栏目信息数
- SQLServer2008 突然用不了搜索文本了,就是Ctrl+F这个功能
- 【常用工具类】SharedPreferences封装类SPUtils
- Android系统架构
- 欢迎使用CSDN-markdown编辑器
- Android基础学习笔记