2.3 Bitmap()位图

转载:https://blog.csdn.net/qq_18108083/article/details/85063072
实现位图并封装在bitmap类中。

操作功能对象
bitmap(int n = 8)构造函数,默认容量为8位位图
bitmap(char* file, int n = 8)构造函数,从指定文件中读取比特图位图
~bitmap()析构函数,释放位图空间位图
init(int n)初始化位图空间位图
set(int k)置位第k个标志位位图
clear(int k)复位第k个标志位位图
test(int k)取出指定字节中的指定位位图
dump(char* file)将位图整体导出至指定的文件位图
bits2string(int n)将前n位转换为字符串位图
expand(int k)扩容位图
print(int n)逐位打印以检验位图内容位图
isPrime(int n)判断某个数是否为素数自然数

(1) bitmap.h

#pragma once
 
#pragma warning(disable : 4996 4800)
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include "math.h"
class bitmap { //位图bitmap类
private:
	char* M; int N; //比特图所存放的空间M[],容量为N*sizeof(char)*8比特
protected:
	void init(int n)   //初始化位图空间
	{
		M = new char[N = (n + 7) / 8];   //申请内存
		memset(M, 0, N);    //初始化内存块
	}
 
public:
	bitmap(int n = 8) { init(n); } //按指定或默认规模创建比特图(为测试暂时选用较小的默认值)
	bitmap(char* file, int n = 8) //按指定或默认规模,从指定文件中读取比特图
	{
		init(n); FILE* fp = fopen(file, "r"); fread(M, sizeof(char), N, fp); fclose(fp);
	}
	~bitmap() { delete[] M; M = NULL; } //析构时释放比特图空间
 
	void set(int k)   //置位第k个标志位
	{ 
		expand(k);   //拓容        
		M[k >> 3] |= (0x80 >> (k & 0x07));  //M[第k个标志位所在的字节(k/8 取整)] |= (第k个标志位在所在字节中的位数(取余)) 
	}
 
	void clear(int k) {
		expand(k);    //拓容 
		M[k >> 3] &= ~(0x80 >> (k & 0x07)); //M[第k个标志位所在的字节(k/8 取整)] &= ~(第k个标志位在所在字节中的位数(取余))
	}
 
	bool test(int k) {//取出指定字节中的指定位
		expand(k);    //拓容 
		return M[k >> 3] & (0x80 >> (k & 0x07));  //M[第k个标志位所在的字节(k/8 取整)] &(第k个标志位在所在字节中的位的值)
	}   
 
	void dump(char* file) //将位图整体导出至指定的文件,以便对此后的新位图批量初始化
	{
		FILE* fp = fopen(file, "w"); fwrite(M, sizeof(char), N, fp); fclose(fp);
	}
 
	char* bits2string(int n) 
	{ //将前n位转换为字符串——
		expand(n - 1); //此时可能被访问的最高位为bitmap[n - 1]
		char* s = new char[n + 1]; s[n] = '\0'; //字符串所占空间,由上层调用者负责释放
		for (int i = 0; i < n; i++) s[i] = test(i) ? '1' : '0';
		return s; //返回字符串位置
	}
 
	void expand(int k) 
	{ //若被访问的bitmap[k]已出界,则需扩容
		if (k < 8 * N) return; //仍在界内,无需扩容
		int oldN = N; char* oldM = M;
		init(2 * k); //与向量类似,加倍策略
		memcpy_s(M, N, oldM, oldN); delete[] oldM; //原数据转移至新空间
	}
 
	void print(int n) //逐位打印以检验位图内容,非必需接口
	{
		expand(n); 
		for (int i = 0; i < n; i++) 
			printf(test(i) ? "1" : "0");
	}
	
	static bool isPrime(int n) {  //判断某个数是否为素数
	if (n <= 3) {
		return n > 1;
	}
	// 不在6的倍数两侧的一定不是质数
	if (n % 6 != 1 && n % 6 != 5) {
		return false;
	}
	int s = (int) sqrt(n);
	for (int i = 5; i <= s; i += 6) {
		if (n % i == 0 || n % (i + 2) == 0) {
			return false;
		}
	}
	return true;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值