位图的学习

news2024/12/26 20:24:01

一,位图介绍

位图(Bitmap)是一种用于存储图像的方式,它通过二维矩阵(由像素组成)来表示图像的每一个细节。每个像素通常对应一个特定的颜色值,位图的每个“位”就代表了图像的一个像素。

位图的基本概念

  • 像素(Pixel):位图图像是由无数个像素组成的,每个像素有一个颜色值。像素是图像中最小的显示单元。
  • 颜色深度:位图的颜色深度决定了每个像素可以表示的颜色数。常见的颜色深度有8位、16位、24位、32位等。颜色深度越高,每个像素可以表示的颜色种类就越多,图像就越细腻。
  • 分辨率:图像的分辨率表示图像的宽度和高度,以像素为单位。例如,1920x1080的分辨率意味着图像宽度为1920像素,高度为1080像素。
  • 文件大小:位图的文件大小通常和图像的分辨率、颜色深度以及压缩方式有关。没有压缩的位图(如BMP文件)通常文件较大。

位图文件格式

常见的位图文件格式有:

  1. BMP(Bitmap Image File):最基础的位图格式,不压缩,文件较大,但图像质量保持完好。
  2. PNG(Portable Network Graphics):无损压缩格式,常用于网页和图形应用,支持透明背景。
  3. JPEG(Joint Photographic Experts Group):有损压缩格式,常用于照片和图像,能够显著减少文件大小,但可能牺牲图像质量。
  4. GIF(Graphics Interchange Format):常用于动画,支持256色的图像,支持透明和动画效果。
  5. TIFF(Tagged Image File Format):用于高质量图像存储,支持无损压缩和多页图像。

位图的优缺点

优点:
  • 精度高:由于每个像素单独存储,位图能够表现非常详细的图像细节。
  • 简单易用:处理位图的算法通常较为简单,适用于需要精确控制图像像素的应用。
缺点:
  • 文件大小大:位图不经过压缩时文件非常大,不适合存储高分辨率的图像。
  • 不适合缩放:位图图像在缩放时容易失真,特别是放大时,可能会出现模糊或锯齿状。

位图与矢量图的对比

  • 位图:图像由像素构成,适合表现细腻的图像(如照片),不适合缩放和改变分辨率。
  • 矢量图:图像由路径、点和线构成,适合用于插图和图形设计,放大或缩小时不会失真。

位图的应用

位图广泛应用于:

  • 数字摄影:大多数数字相机和手机拍摄的照片都是位图格式。
  • 网页设计:许多网页图像和图标使用PNG、JPEG等位图格式。
  • 图像编辑:例如Photoshop等图像编辑软件,处理的通常是位图图像。
  • 图形显示:例如显示屏、打印机等设备的图像输出通常是位图形式。

总结

位图是一种通过像素矩阵来表达图像的方式,适合存储高质量的图像,广泛应用于数字图像处理、网页设计、摄影等领域。它的文件大小较大,不适合于图像的频繁缩放,而矢量图则在这方面表现得更好。

二,使用位图实现哈希表

1,原理

因为1个int类型含有4个字节,有32个bit,使用每个bit位上0和1的状态来表示该数字是否加入表中,但这就要求哈希表是只能存储连续数字。

2,补充

1)怎么向上取整

已知计算机里只有向下取整,如:2 / 3 = 0;4 / 3 = 1;6 / 3 = 2;

但向下取整是 2 / 3 = 1;3 / 3 = 1;如果想通过a / b + 1来实现是不可能的,因为如果a = b的话就不对了。

所以采用(a + b -  1)/ b ,因为如果a 除 b 后还有余数,b - 1可以让余数升到下一位从而结果加1,如果没有余数也不会影响结果。

三,对数器验证

1,如何随机生成0到1的小数

2,错误展示

else
{
    bitset.flip_num(number);
    if (hashset.find(number) != hashset.end())
    {
        hashset.insert(number);
    }
}

这里if操作错误,找到后应该删去,同时缺少没有找到后插入该数字。

3,代码

#include<iostream>
#include<random>
#include<unordered_set>

using namespace std;
random_device rd;
default_random_engine gen(rd());
uniform_real_distribution<double> probability(0.0, 1.0);


struct Bitset
{
public:
	int* bitset;
	int len;

	Bitset(int x) : len((x + 31) / 32)
	{
		bitset = new int[len];
	}

	void add_num(int n)
	{
		bitset[n / 32] |= 1 << (n % 32);
	}

	void remove_num(int n)
	{
		bitset[n / 32] &= ~(1 << (n % 32));
	}

	void flip_num(int n)
	{
		bitset[n / 32] ^= 1 << (n % 32);
	}
	//翻转的意思是原来数组有就变为没有,如果原来没有现在变为有。

	bool find_num(int n)
	{
		return ( (bitset[n / 32] >> (n % 32)) & 1 ) == 1;
	}

};

void Test_machine(Bitset& bitset,int test_times,int len)
{
	uniform_int_distribution<int> dis(0, len - 1);
	unordered_set<int> hashset;
	double chance;
	int number;

	cout << "测试开始" << endl;

	bitset.add_num(5);
	hashset.insert(5);
	if (bitset.find_num(5) != (hashset.find(5) != hashset.end()))
	{
		cout << "出错了" << endl;
	}


	cout << "调用阶段开始" << endl;
	for (int i = 0; i < test_times; i++)
	{
		chance = probability(gen);
		number = dis(gen);
		if (chance < 0.33)
		{
			bitset.add_num(number);
			hashset.insert(number);
		}
		else if (chance < 0.66)
		{
			bitset.remove_num(number);
			hashset.erase(number);
		}
		else
		{
			bitset.flip_num(number);
			if (hashset.find(number) != hashset.end())
			{
				hashset.erase(number);
			}
			else
			{
				hashset.insert(number);
			}

		}
	}
	cout << "调用阶段结束" << endl;

	cout << "验证阶段开始" << endl;
	for (int i = 0; i < len; i++)
	{
		if (bitset.find_num(i) != (hashset.find(i) != hashset.end()))
		{
			cout<<"出错了"<<endl;
		}
	}

	cout << "验证阶段结束" << endl << "测试结束" << endl;
}

int main()
{
	Bitset bitset(20);
	Test_machine(bitset, 10, 20);
	return 0;
}

四,补充题

题目

代码

#include<iostream>

struct Bitset
{
public:
	int* bitset;
	int size;
	int zeros, ones;
	bool reverse = false;

	Bitset(int n) :size(n) 
	{
		zeros = size;
		ones = 0;
		bitset = new int[(size + 31) / 32];
	}

	void fix(int i)
	{
		int index = i / 32;
		int bit = i % 32;
		if (!reverse)
			//在bitset未被翻转时,reverse是false。
			//此时0代表不存在,1代表存在。
		{
			if ((bitset[index] & 1 << bit) == 0)
			{
				zeros--;
				ones++;
				bitset[index] ^= 1 << bit;
			}
		}
		else
			//如果bitset被翻转,则reverse是true
			//此时0代表存在,1代表不存在。
			//使用reverse是为了翻转时不必遍历每一位。
		{
			if ((bitset[index] & 1 << bit) != 0)
			{
				zeros--;
				ones++;
				bitset[index] ^= 1 << bit;
			}
		}
	}


	void flip()
	{
		reverse = !reverse;
		int temp;
		temp = zeros;
		zeros = ones;
		ones = temp;
	}

	bool all()
	{
		return ones == size;
	}

	bool one()
	{
		return ones > 0;
	}

	int count_ones()
	{
		return ones;
	}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正则化(Regularization)

正则化&#xff08;Regularization&#xff09;是机器学习和统计建模中用来防止过拟合的一种技术。当模型过于复杂&#xff0c;例如拥有过多的参数或层级时&#xff0c;它可能会在训练数据上表现得非常好&#xff0c;但对未见过的数据&#xff08;即测试数据或真实世界的数据&a…

集成网关 -- 新节点的开发说明

在node-red中&#xff0c;nVisual节点可以帮助我们更快快简捷的完成新的功能&#xff0c;今天我来分享一下关于node-Red中关于nVisual新节点开发基础教程。 首先来看一下基本node-red节点文件目录&#xff0c;当前新开发的7个节点都放在了“node-red\packages\node_modulesno…

小程序入门学习(六)之本地生活案例

效果图如下&#xff1a; 关键代码如下&#xff1a; app.json {"pages": ["pages/home/home","pages/message/message","pages/contact/contact"],"window": {"backgroundTextStyle": "light","n…

ArcGIS对地区进行筛选提取及投影转换

首先我们需要对坐标系和投影这些概念做进一步的解释。 1、基本概念&#xff1a; 想要理解坐标系和投影的概念&#xff0c;首先我们需要先理解什么是坐标。顾名思义&#xff0c;坐标就是指我们所在的位置&#xff0c;比如我在离旗杆东北部50m处&#xff0c;其实就是离旗杆东边…

MFC图形函数学习13——在图形界面输出文字

本篇是图形函数学习的最后一篇&#xff0c;相关内容暂告一段落。 在图形界面输出文字&#xff0c;涉及文字字体、大小、颜色、背景、显示等问题&#xff0c;完成这些需要系列函数的支持。下面做简要介绍。 一、输出文本函数 原型&#xff1a;virtual BOOL te…

Mysql如何实现原子性(MVCC实现原理)

Mysql如何实现原子性(MVCC实现原理) Mysql实现原子性主要通过一下机制 锁MVCC多版本并发控制 MVCC的实现原理 在介绍MVCC的实现原理之前需要先介绍一下Mysql表中的隐藏字段 , 以及undo_log版本链以及readview 1. Mysql中的隐藏字段 Mysql在创建表的时候除了我们所定义的字…

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题&#xff1a; 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 &#xff01;&#xff01;&#xff01; 2、查询服务器中MySQL中hive的数据库&#xff0c;发现创建的位置没有在hdfs上&#xff0c;而是在本地。 这个错误产生的原因是&…

Leetcode - 周赛426

目录 一&#xff0c;3370. 仅含置位位的最小整数 二&#xff0c;3371. 识别数组中的最大异常值 三&#xff0c;3372. 连接两棵树后最大目标节点数目 I 四&#xff0c;3373. 连接两棵树后最大目标节点数目 II 一&#xff0c;3370. 仅含置位位的最小整数 两种做法&#xff1a…

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化&#xff08;L1 and L2 Regularization&#xff09; 引言1. Forward Pass2. Backward pass到此为止的全部代码&#xff1a; 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值&#xff08;称为惩…

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.1.1 cpu虚拟化 一级目录 一级目录 一级目录 一级目录 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09; 1.1.1 cpu虚…

关于 Qt编译遇到fatal error C1189: #error: “No Target Architecture的 解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144205902 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下&#xff0c;分析酷狗音乐上的热门歌曲及其用户行为趋势&#xff0c;对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析&#xff0c;可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

掌握排序艺术:Java 中常见排序算法的深度解析与实战

排序是计算机科学中的一个基本问题&#xff0c;它在数据处理、搜索和分析中扮演着重要角色。Java提供了多种内置的排序方法&#xff0c;但了解不同排序算法的工作原理及其优缺点对于优化性能和选择合适的解决方案至关重要。本文将详细介绍几种常见的排序算法&#xff0c;包括它…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

Linux系统编程之进程控制

概述 在Linux系统中&#xff0c;创建一个新的进程后&#xff0c;如何对该进程进行有效的控制&#xff0c;是一项非常重要的操作。控制进程状态的操作主要包括&#xff1a;进程的执行、进程的等待、进程的终止等。下面&#xff0c;我们将逐个进行介绍。 进程的执行 创建进程后&a…

猜数字的趣味小游戏——rand函数、srand函数、time函数的使用

文章目录 前言一、随机数的生成1.1. rand函数1.2. srand函数1.3. time函数 二、设置随机数的范围三、猜数字游戏的代码实现总结 前言 上一篇博客我们写了一个电脑关机的小游戏&#xff0c;我篇博客我们写一个猜数字的小游戏&#xff0c;学习rand函数、srand函数、time函数的使…

ScratchLLMStepByStep:一步一步构建大语言模型教程

前言 在学习大语言模型的时候&#xff0c;总会遇到各种各样的名词&#xff0c;像自注意力、多头、因果、自回归、掩码、残差连接、归一化等等。这些名词会让学习者听的云里雾里&#xff0c;觉得门槛太高而放弃。 本教程将会带你从零开始&#xff0c;一步一步的去构建每一个组…

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式&#xff08;Flyweight Pattern&#xff09; 这里是引用享元模式&#xff08;Flyweight Pattern&#xff09; 是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;尤其适用于大量相似对象的场景。通过共享和重用对象的…