通过bitmap的方式用8个int实现对256个char是否出现过做记录
2012-12-13 14:34
288 查看
程序设计中经常会出现这样的场景:遍历一个字符串a(例如:“A dog in on the floor.”),对于字符串b(例如“dnr”)中出现过的字符,统统删掉。
那么对于b中出现的字符,通常可以保存在bool label[256]中来记录某个字符是否在字符串b中。
但是还可以用一种更省内存的方式,就是bitmap。
通过定义Set,ReSet和Get宏来快速定位某一个bit。
并且使用sizeof(int)和动态数组来适应64位平台。
EOF
那么对于b中出现的字符,通常可以保存在bool label[256]中来记录某个字符是否在字符串b中。
但是还可以用一种更省内存的方式,就是bitmap。
通过定义Set,ReSet和Get宏来快速定位某一个bit。
并且使用sizeof(int)和动态数组来适应64位平台。
#include <iostream> using namespace std; int intWidth = sizeof(int) * 8; int *label = new int[256/intWidth]; #define Set(i) label[i/intWidth] |= 1<<(i%intWidth) #define ReSet(i) label[i/intWidth] &= 0<<(i%intWidth) #define Get(i) (label[i/intWidth] >> (i%intWidth))&0x01 int main() { memset(label, 0, 256/intWidth * sizeof(int)); for (int i = 0; i < 256; i++) { unsigned char c = i; cout<<"====================================="<<endl; cout<<"i = "<<i<<" c = "<<c<<endl; Set(c); cout<<"After Set("<<c<<") "; if (Get(c)) cout<<c<<" exists!"<<endl; else cout<<c<<" not exists!"<<endl; ReSet(c); cout<<"After ReSet("<<c<<") "; if (Get(c)) cout<<c<<" exists!"<<endl; else cout<<c<<" not exists!"<<endl; cout<<"====================================="<<endl<<endl; } return 0; }
EOF
相关文章推荐
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- 通过构造器启动线程的实现方式及其缺点记录。
- 通过修改CATALOG记录的方式实现备份集目录变更
- C++实现记录类型内存分配方式的包装类,使对象(或原始类型)只能通过new的方式实例化
- 通过servlet记录应用是否重启的方式
- 运用VC#编程通过OPC方式实现PC机与西门子PLC通讯《异步篇》
- TWaver HTML5学习笔记 —— 通过图层方式控制元素是否显示
- MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标
- 通过命令的方式实现计算机定时关机
- linux系统实现php通过pdo方式对sqlserver数据库的支持
- 任意文字,任意图片,彩色lcd显示,画面实时更新,全部通过非gui方式实现了。
- 在asp中通过getrows实现数据库记录分页的一段代码
- PL/SQL通过修改配置文件的方式实现数据库的连接
- 通过证书方式实现ssh的无密码登陆
- mini2440开发板运行Qt程序出现Segmentation fault的另一种奇葩原因:Ubuntu下使用FileZilla通过FTP方式传输程序
- 前后台实现验证当前操作记录是否存在
- SpringMVC实现velocity多Resourceloader通过文件、数据库等方式加载模版