C++实现位数组
当我们遇到大量整数排序时候为了节省内存空间我们能够考虑使用bit数组来实现,缺点是其仅仅适用于正整数。
思想:
在32位系统一个int类型占4个字节,按位来计算一个int类型能够记录32个数。因此,採用int型数组和移位来实现相关功能。
C++实现bit数组
#include<iostream>
using namespace std;
const unsigned int bitValue[32]=
{
0x80000000,
0x40000000,
0x20000000,
0x10000000,
0x08000000,
0x04000000,
0x02000000,
0x01000000,
0x00800000,
0x00400000,
0x00200000,
0x00100000,
0x00080000,
0x00040000,
0x00020000,
0x00010000,
0x00008000,
0x00004000,
0x00002000,
0x00001000,
0x00000800,
0x00000400,
0x00000200,
0x00000100,
0x00000080,
0x00000040,
0x00000020,
0x00000010,
0x00000008,
0x00000004,
0x00000002,
0x00000001
};
const int bitLen =sizeof(int)*8;
class BitArray
{
private:
unsigned int len;
unsigned int *bit;
public:
BitArray(unsigned int length)
{
if(length<0)
{
throw "length 小于 0";
}
this->len=length;
bit= new unsigned int[length/bitLen+(length%bitLen>0?1:0)]();//初始化为0
}
unsigned int getBit(int index)
{
if(index<0||index>len)
{
throw "index 越界";
}
unsigned int data=bit[index/bitLen];
return (data&bitValue[index%bitLen])>>(bitLen-index%bitLen-1);
}
void setBit(unsigned int index,unsigned int value)
{
if(index<0||index>len)
{
throw "index 越界";
}
if(value!=1&&value!=0)
{
throw "value 值仅仅能为1或者0";
}
unsigned int data=bit[index/bitLen];//计算出其属于数组中哪个int值
if(value==1)
{
bit[index/bitLen]=data|bitValue[index%bitLen];
}else
{
bit[index/bitLen]=data&~bitValue[index%bitLen];
}
}
unsigned int getLength()
{
return this->len;
}
~BitArray()
{
delete[] bit;
}
}; int main()
{
try
{
BitArray bArray(1000000);
bArray.setBit(99999,1);
bArray.setBit(201,1); cout<<bArray.getBit(0)<<endl;
cout<<bArray.getBit(99999)<<endl;
cout<<bArray.getBit(10000)<<endl;
}
catch(char *str_ex)
{
cout<<str_ex<<endl;
}
cin.get();
return 0;
}
C++实现位数组的更多相关文章
- 用C语言关于学生管理系统的几种实现方法(一位数组,二维数组,指针,结构体)
一位数组: #include <stdio.h> #include<string.h> #define N 5 void luru(float s[],int n); void ...
- C++ 出现bug :二位数组的操作运算,求非对角线的元素的和
编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; ...
- 如何实现简单的位数组(bit array)(转)
源:如何实现简单的位数组(bit array) 在 comp.lang.c 上面看到一则不错的 FAQ,<How can I implement sets or arrays of bits?& ...
- [翻译] Linux 内核中的位数组和位操作
目录 Linux 内核里的数据结构 原文链接与说明 Linux 内核中的位数组和位操作 位数组声明 体系结构特定的位操作 通用位操作 链接 Linux 内核里的数据结构 原文链接与说明 https:/ ...
- C#编程(五十七)----------位数组
位数组 如果需要处理很多位,就可以使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System. ...
- C#高级编程五十七天----位数组
位数组 假设须要处理非常多位,就能够使用BitArray类和BitVector32.BitArray位于命名空间System.Collections中. BitVector32位于命名空间System ...
- PHP 之二位数组根据某个字段排序封装
/** * @param $array * @param $keys * @param string $sort * @return array */ function arraySort($arra ...
- c15--二位数组
// // main.c // day08 #include <stdio.h> int main(int argc, const char * argv[]) { /* int scor ...
- java中Arrays.sort()对二位数组进行排序
int [][]a = new int [5][2]; //定义一个二维数组,其中所包含的一维数组具有两个元素 对于一个已定义的二位数组a经行如下规则排序,首先按照每一个对应的一维数组第一个元素进行升 ...
- C和指针 第五章 位数组
5.4的习题:编写一组函数,实现维数组,函数原型如下: //指定位设置为1void set_bit(char bit_array[], unsigned bit_number); //指定位清零 vo ...
随机推荐
- 南海区行政审批管理系统接口规范v0.3(规划)4.1.【queryAcceptById】业务明细查询
加密前:{"time":"1510061005493","username":"GH_DATA_EXCHANGE",&q ...
- Meson使用
安装 Meson是基于python3实现,至少需要python3.5才能运行,默认采用ninja作为后端.在Ubuntu下最简单的是通过pip3安装 $ sudo apt-get install py ...
- 21. Merge Two Sorted Lists[E]合并两个有序链表
题目 Merge two sorted linked lists and return it as a new list. The new list should be made by splicin ...
- let,const,var三者之间的区别
在ES6中新增了两种定义变量的命令let和const,在这之前相信大家都对var定义变量很熟悉,那么在了解ES6方法前, 1.我们先来回顾一下var定义变量的方法. 下面来看这段代码: for (va ...
- JavaScript实现鼠标效果
<html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...
- 【MFC】模态、非模态对话框
MFC 点击按钮,弹出另一个对话框 方法一:模态对话框 资源视图–Dialog–右键–添加资源–新建–对话框-,然后在已经生成的对话框中(解决资源视图中的dialog下的新生成的那个)右键–添加类.例 ...
- SQLite Tips
附加数据库 Attach database filename as database_name; 主数据库默认为 "Main", 在使用Attach命令时, 不能将database ...
- React 学习笔记:1-react 入门
接下来的项目里有用到react,最近一段时间主要关注于react 的学习.大部门都是网上的资料,学习整理并记录,加深记忆. React 是Facebook推出的用来构建用户界面的JavaScript库 ...
- String、Stringbuffer、StringBuffer回顾
前言: 久了没用到,一下子就忘了..,参考文章:https://www.cnblogs.com/su-feng/p/6659064.html.https://baijiahao.baidu.com/s ...
- BZOJ 1303: [CQOI2009]中位数图 问题转化_扫描_思维
将比 b 大的设成 1,比 b 小的设成 -1,开个桶左右扫描一下,乘法原理乘一乘就好了. 虽然一眼切,不过这个基于中位数的转化还是相当重要的.middle 那个主席树的题也需要该做法 Code: # ...