详解位示图计算方法、代码

news2024/9/28 5:35:46

位示图

  • 位示图的核心思想
  • 计算过程与位操作
    • 假设问题场景:
  • 实际操作与计算:
    • 1. 位示图的初始化
    • 2. 设置某一位(标记资源占用)
    • 3. 清除某一位(释放资源)
    • 4. 查询某一位(检查资源状态)
  • 示例
    • 问题描述:
    • 关键参数:
    • 位示图大小的计算步骤:
      • 1. 计算磁盘上的物理块数量:
      • 2. 计算位示图的总位数:
      • 3. 计算位示图的字节数:
    • 计算实例:
      • 参数设定:
      • 步骤1:计算物理块数量
      • 步骤2:计算位示图总位数
      • 步骤3:计算位示图的字节数
    • 优化讨论:字长的影响
    • 完整示例:
      • 结果解释:
  • 综合示例:
    • 详细讲解每一步:
  • 理论优势与应用场景
  • 练题
    • 已知参数:
    • 计算过程:
      • 1. 计算磁盘的物理块数量
      • 2. 计算位示图总位数
      • 3. 计算位示图的字节数
      • 4. 计算位示图的字数
    • 结论:

位示图(Bit-Map)是一种非常紧凑和高效的位操作技术,特别适用于管理系统资源或者表示大规模数据的某种状态。在位示图中, 每一位都代表某个资源或元素的状态。为了更生动地理解其工作原理,我们可以从理论计算和位运算的角度进行深入探讨,并通过详细的示例展示如何使用位示图来解决问题。

位示图的核心思想

位示图的基本思想是将每一位(bit)作为一种状态标识,状态可以是“已占用”或“未占用”,或者“存在”或“不存在”。位示图最常用于两个状态的管理,因为每一位(bit)只能存储0或1。

计算过程与位操作

假设我们要管理一个系统中8个资源块的使用情况。最简单的方法是使用一个8位的变量,每个位代表一个资源块。位的设置和清除通常通过位运算来完成。

假设问题场景:

我们有一个系统资源,共8个块,编号从0到7。我们需要跟踪哪些块已经被使用,哪些块是空闲的。使用位示图,我们可以紧凑地用8个bit来表示这8个资源的状态。

实际操作与计算:

1. 位示图的初始化

位示图可以用一个字节(8位)表示,初始状态下所有位都是0,表示资源未被占用。

unsigned char bitmap = 0b00000000; // 全部位为0,表示资源未使用

位示图的初始值为 0b00000000。这里使用二进制表示法 0b 表示8位都为0。

2. 设置某一位(标记资源占用)

当我们想要标记第2号块已经被使用,可以通过**位“或”运算(OR运算)**来设置某一位为1。

bitmap |= (1 << 2); // 设置第2位
  • 1 << 2 将1左移两位,得到 0b00000100,这是只将第2位设为1的掩码(mask)。
  • bitmap |= 0b00000100 将位示图与这个掩码做“或”运算,结果是将第2位设置为1而不影响其他位。

理论计算
bitmap = 0b00000000 | 0b00000100 = 0b00000100
此时,位示图的值变为 0b00000100,表示第2号块被占用。

3. 清除某一位(释放资源)

假设我们要释放第2号块,将该块标记为可用。我们使用**位“与”运算(AND运算)**与取反(NOT)来清除位。

bitmap &= ~(1 << 2); // 清除第2位
  • 1 << 2 得到 0b00000100
  • ~(1 << 2) 取反得到 0b11111011,这是清除第2位的掩码。
  • bitmap &= 0b11111011 将位示图和掩码做“与”运算,清除第2位为0。

理论计算
bitmap = 0b00000100 & 0b11111011 = 0b00000000
此时,位示图的值恢复为 0b00000000,表示第2号块已释放。

4. 查询某一位(检查资源状态)

我们可以通过位“与”运算检查某一位的状态,看看某个资源是否被使用。

int is_set = bitmap & (1 << 2); // 查询第2位是否为1
  • 1 << 2 得到 0b00000100,然后通过位“与”运算,检查第2位是否为1。

理论计算
is_set = 0b00000000 & 0b00000100 = 0b00000000
返回值为0,表示第2位(第2号块)未被使用。
为了更详细地说明如何通过位示图管理资源,以及如何计算位示图的大小,我们需要引入计算机系统的一些关键参数,比如字长磁盘容量、和物理块大小。接下来,我们通过一个实际的计算示例,演示如何根据这些参数计算位示图的大小。

示例

问题描述:

假设我们有一个磁盘系统,它的磁盘容量是已知的,并且该磁盘被划分为若干个物理块。为了管理这些物理块的使用情况,我们使用位示图。我们需要根据系统的磁盘容量和每个物理块的大小来计算位示图的大小。

关键参数:

  1. 磁盘容量(Total Disk Capacity):磁盘的总容量,用字节(Bytes)表示。
  2. 物理块大小(Block Size):磁盘中每个物理块的大小,通常以字节(Bytes)表示。
  3. 位示图大小(Bitmap Size):位示图所占用的空间大小,用字节表示。
  4. 字长(Word Size):计算机系统中,CPU能够一次处理的位数,常见的字长有32位和64位。字长影响位示图的读取和存储效率,但不会直接影响位示图所需的大小。

位示图大小的计算步骤:

1. 计算磁盘上的物理块数量:

磁盘被分割成若干个物理块,位示图中的每一位(bit)用来表示一个物理块的使用情况。因此,首先我们需要根据磁盘的总容量和每个物理块的大小来计算物理块的总数:

在这里插入图片描述

2. 计算位示图的总位数:

由于每一位表示一个物理块,位示图的总位数就等于物理块的总数:

在这里插入图片描述

3. 计算位示图的字节数:

位示图的总位数可以通过除以8(因为1字节 = 8位)来得到位示图的字节数:

在这里插入图片描述

计算实例:

参数设定:

  • 磁盘容量 = 1 TB = 1,024 GB = ( 1,024 \times 1,024 \times 1,024 ) 字节
  • 物理块大小 = 4 KB = ( 4 \times 1,024 ) 字节
  • 字长 = 64 位(虽然字长不影响位示图大小,但在后面讨论优化时会提到)

步骤1:计算物理块数量

根据给定的磁盘容量和每个物理块的大小,我们首先计算物理块的数量:

在这里插入图片描述

步骤2:计算位示图总位数

位示图中的每一位表示一个物理块的使用情况,因此位示图总位数等于物理块的数量:

在这里插入图片描述

步骤3:计算位示图的字节数

现在,我们将位示图的总位数转换为字节数:

在这里插入图片描述

优化讨论:字长的影响

虽然字长不影响位示图的总大小,但它确实影响读取和操作位示图的效率。假设系统的字长是64位,那么我们可以一次读取64位的数据,这比32位系统一次读取32位更快。位示图的优化涉及位操作的效率,比如查询或修改某个位是否为1,通常与系统的字长相关联。

对于64位系统,读取位示图时可以将64位划分为一个“块”处理,这样位示图中的一大段数据可以通过一次操作被访问,而在32位系统中,处理同样的数据可能需要两次操作。因此,字长较大的系统在管理位示图时会更高效。

完整示例:

假设我们要计算位示图的大小,并展示如何进行相关位运算。下面是一个更详细的代码示例,结合上面的理论计算来进行位示图的管理:

#include <stdio.h>

int main() {
    // 定义磁盘容量和块大小
    unsigned long long disk_capacity = 1024LL * 1024 * 1024 * 1024; // 1 TB 磁盘容量
    unsigned int block_size = 4 * 1024; // 4 KB 块大小
    
    // 计算物理块数量
    unsigned long long num_blocks = disk_capacity / block_size;
    
    // 计算位示图需要的字节数
    unsigned long long bitmap_size = num_blocks / 8; // 每个字节可以表示8个块
    
    printf("磁盘容量: %llu 字节\n", disk_capacity);
    printf("物理块大小: %u 字节\n", block_size);
    printf("物理块数量: %llu 个\n", num_blocks);
    printf("位示图大小: %llu 字节\n", bitmap_size);

    // 示例位示图初始化和位操作
    unsigned char bitmap[bitmap_size]; // 位示图数组
    for (unsigned long long i = 0; i < bitmap_size; i++) {
        bitmap[i] = 0; // 初始化位示图为0
    }

    // 设置第1000个块为已使用
    unsigned long long block_to_set = 1000;
    bitmap[block_to_set / 8] |= (1 << (block_to_set % 8));

    // 检查第1000个块是否已使用
    if (bitmap[block_to_set / 8] & (1 << (block_to_set % 8))) {
        printf("第1000个块已使用\n");
    } else {
        printf("第1000个块未使用\n");
    }

    return 0;
}

结果解释:

  • 磁盘容量:1 TB,表示整个磁盘的总大小。
  • 物理块大小:4 KB,表示每次存储或读取的最小单位。
  • 物理块数量:262,144,000个物理块。
  • 位示图大小:32,768,000字节,用来表示所有这些块的状态。

通过这个过程,我们可以高效地使用位示图来管理磁盘块的分配和回收,同时对系统资源的利用进行优化管理。

综合示例:

假设我们有以下一系列操作:

  1. 第0号块被使用。
  2. 第3号块被使用。
  3. 第5号块被使用。
  4. 查询第3号块是否被使用。
  5. 释放第3号块。
  6. 最后打印出位示图状态。

我们可以通过位运算来逐步实现。

#include <stdio.h>

int main() {
    unsigned char bitmap = 0b00000000; // 位示图初始值,全为0

    // 设置第0、3、5位
    bitmap |= (1 << 0); // 设置第0位,bitmap变为0b00000001
    bitmap |= (1 << 3); // 设置第3位,bitmap变为0b00001001
    bitmap |= (1 << 5); // 设置第5位,bitmap变为0b00101001

    // 查询第3位
    if (bitmap & (1 << 3)) {
        printf("第3号块被使用\n");
    } else {
        printf("第3号块空闲\n");
    }

    // 释放第3号块
    bitmap &= ~(1 << 3); // 清除第3位,bitmap变为0b00100001

    // 打印位示图状态
    printf("位示图当前状态: 0b%08b\n", bitmap); // 输出为0b00100001

    return 0;
}

详细讲解每一步:

  1. 初始状态
    bitmap = 0b00000000。所有位都为0,表示没有资源被使用。

  2. 设置第0号块
    bitmap |= (1 << 0) -> bitmap = 0b00000001,第0位变为1,表示第0号块被使用。

  3. 设置第3号块
    bitmap |= (1 << 3) -> bitmap = 0b00001001,第3位变为1,表示第3号块也被使用。

  4. 设置第5号块
    bitmap |= (1 << 5) -> bitmap = 0b00101001,第5位也变为1,表示第5号块被使用。

  5. 查询第3号块
    bitmap & (1 << 3) -> 结果不为0,表示第3号块确实被使用。

  6. 释放第3号块
    bitmap &= ~(1 << 3) -> bitmap = 0b00100001,第3位被清除为0,表示第3号块被释放。

  7. 最终状态
    输出结果 0b00100001 表示第0和第5号块被使用,其他块空闲。

理论优势与应用场景

位示图的主要优势在于:

  • 高效的空间利用:每一位只需要1 bit,比起使用整型数组更节省空间。
  • 快速查询:通过简单的位运算即可实现状态的高效查询与修改。

位示图在文件系统、内存管理、并行处理中的任务分配等场景中非常常用,尤其是在资源状态需要频繁查询、设置、清除的情况下。

练题

我们来计算计算机系统的字长为64位、磁盘容量为512GB、物理块大小为4MB时的位示图大小。

已知参数:

  1. 磁盘容量 = 512GB = ( 512 \times 1024 \times 1024 \times 1024 ) 字节
  2. 物理块大小 = 4MB = ( 4 \times 1024 \times 1024 ) 字节
  3. 字长 = 64位(计算位示图大小时,字长并不影响位示图总大小,它影响的是读取的效率)

计算过程:

1. 计算磁盘的物理块数量

首先我们需要计算磁盘上总共有多少个物理块:

在这里插入图片描述

将具体的值代入公式:

在这里插入图片描述

2. 计算位示图总位数

因为每一位表示一个物理块是否已被使用,所以位示图的总位数等于物理块的数量:

在这里插入图片描述

3. 计算位示图的字节数

位示图的总位数转化为字节数,我们知道1字节等于8位,因此:

在这里插入图片描述

4. 计算位示图的字数

我们要根据64位字长计算位示图的大小,以字为单位。由于1个字等于64位(即8字节),因此:

在这里插入图片描述

将计算出的字节数代入公式:

在这里插入图片描述

结论:

在字长为64位、磁盘容量为512GB、物理块大小为4MB的情况下,位示图的大小为2,048字

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

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

相关文章

【2米/8米光学卫星】

2米/8米光学卫星 2米/8米光学卫星&#xff0c;通常指的是GF-1 B、C、D卫星&#xff0c;这是我国民用空间基础设施发展规划中的首个民用高分辨率光学陆地业务星座&#xff0c;也是自然资源部组建后发射的首批业务卫星。以下是对该卫星的详细介绍&#xff1a; 一、基本信息 发…

k8s 分布式存储平台 -- Longhorn

文章目录 一、什么是 Longhorn二、架构设计1、工作原理2、工作流程3、基于微服务设计的优势 三、安装1、安装要求2、使用 Longhorn 命令行工具&#xff08;验证方式一&#xff09;3、使用环境检查脚本&#xff08;验证方式之二&#xff09;3.1、安装 jq3.2、运行脚本 4、安装 o…

AI会议时代:企业如何搭上快车?

“我 们认为&#xff0c;AI绝不仅是会议的辅助工具&#xff0c;而更会是重塑会议流程的关键力量。通过AI的个性化定制、大规模支持、智能分析这些技术&#xff0c;AI会议将大大提升会议的智能化与高效性&#xff0c;进而成为企业数字化转型的核心驱动力。” 作者|斗斗 编辑…

QTreeview model过滤

QTreeview model数据过滤&#xff1a;大小写区分&#xff0c;对列过滤&#xff0c;对子对象过滤 示例&#xff1a; 需要自定义QSortFilterProxyModel, //自定义过滤model mProxyModel new TreeFilterProxyModel(this); //添加treeview当前model mProxyModel->setSource…

【源码+文档+调试讲解】学生选课系统Python

摘 要 学生选课系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写&#xff0c;使用了Django框架。该系统从三个对象&#xff1a;由管理员和学生、教师来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对学生、教…

Brave编译指南2024 MacOS篇-获取源码(三)

引言 在上一篇文章中,我们介绍了Brave浏览器的基本特性,以及编译Brave所需的系统要求和推荐工具。现在,我们将进入编译过程的第一个实际步骤:获取Brave的源代码。这一步骤对于后续的编译和开发工作至关重要。 1. Brave源码的获取途径 Brave的源码托管在GitHub上,任何人都可以…

YOLO格式数据集转为COCO数据集(简单粗暴)

最近需要用的coco格式的数据集&#xff0c;但是在网上找的很多 毕竟麻烦&#xff0c;简单记录一下&#xff01; 1、调整目录结构&#xff08;以GC10-DET数据集为例&#xff09; YOLO格式数据集目录结构如下&#xff1a; 简单来说就是images文件夹里面有train、val、test三个文…

OJ在线评测系统 在Linux虚拟机搭建Docker 概念 入门 安装

Docker的基本概念 为什么要用docker容器技术 为了提升系统的安全性 把不同的程序和宿主机进行隔离 使得某个程序 应用的执行不会影响到系统本身 docker技术可以实现程序和宿主机的隔离 容器可以理解成对一系列应用程序、服务和环境的封装 从而把程序运行在一个隔离的 封闭…

在阿里云PAI的DSW上面部署InternLM-XComposer2-VL-1.8B和InternVL2-2B

1.准备开发环境 1.1 阿里交互式建模(DWS) 首先,去阿里云账号注册界面注册好自己的账号然后,开通人工智能平台PAI 如果已经开通,可以进入管理控制台点击,“新建实例”实例名称,根据自己的意愿填写资源配额选择"公共资源组(按量付费)"资源规格"ecs.gn7i-c8g1.2x…

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出

回归预测合集|基于灰狼优化21个机器学习和深度学习的数据回归预测Matlab程序 多特征输入单输出 文章目录 一、清单二、实验结果三、核心代码四、代码获取五、总结 一、清单 基于灰狼优化BP神经网络的数据预测Matlab程序GWO–BP 基于灰狼优化卷积神经网络的数据预测Matlab程序G…

c++day08

思维导图 栈 #include <iostream>using namespace std;template <typename T> class Stack { private:static const size_t MAX 100; // 定义固定容量T data[MAX]; // 存储栈元素的数组size_t len; // 当前栈的大小public:…

华为玄玑感知系统震撼发布:智能穿戴新品引领情绪健康新纪元

在科技日新月异的今天&#xff0c;华为再次以其卓越的创新能力&#xff0c;为智能穿戴领域带来了一场革命性的变革。 8月28日&#xff0c;华为玄玑感知系统暨穿戴创新技术发布会圆满落幕&#xff0c;会上正式揭晓了这款名为“玄玑”的神秘感知系统&#xff0c;预示着穿戴设备将…

9.26 Buu俩题解

[CISCN2019 华东北赛区]Web2 看wp写完之后写的 知识点 存储型XSS与过滤绕过sql注入 题解 好几个页面&#xff0c;存在登录框可以注册&#xff0c;存在管理员页面(admin.php) ->既然存在管理员页面&#xff0c;且直接访问admin.php提示我们 说明存在身份验证&#xff0…

【深度学习】低维向量映射到高维空间的方法

低维向量映射到高维空间的方法 1、全连接层&#xff08;线性层&#xff09;&#xff1a; 全连接层&#xff0c;也称为线性层&#xff0c;是神经网络中最基本的组件之一。它通过一个权重矩阵和一个偏置向量对输入向量进行线性变换。如果输入向量的维度是 din&#xff0c;而我们…

Splashtop 加入 Microsoft 智能安全协会

2024年9月25日 美国加利福尼亚州库比蒂诺 Splashtop Inc . 今天宣布已正式加入 Microsoft 智能安全协会&#xff08;MISA&#xff09;。MISA 由独立软件供应商&#xff08;ISV&#xff09;和托管安全服务提供商&#xff08;MISA&#xff09;组成&#xff0c;他们将其解决方案与…

无人机之视觉导航算法篇

一、图像采集与预处理 图像采集&#xff1a;无人机通过其搭载的摄像头或其他视觉传感器实时采集周围环境的图像信息。 图像预处理&#xff1a;对采集到的图像进行预处理&#xff0c;包括滤波、降噪、增强等操作&#xff0c;以提高图像的质量和清晰度&#xff0c;为后续的特征…

Linux当中的权限问题

文章目录 一、Linux权限的概念1. Linux中的用户分类2. 不同用户之间的转换(1) 普通用户->root(2) root->普通用户(3) 普通用户->普通用户 二、Linux权限管理1. 文件访问者的分类2. 文件类型和访问权限&#xff08;1&#xff09;文件后缀在Linux中的作用&#xff08;2&…

三个视觉领域常用数据标注工具:labelImg 解压安装基础使用、 label-studio 的安装和基础使用【检测数据标注】

&#x1f947; 版权: 本文由【墨理学AI】原创、在CSDN首发、各位大佬、敬请查阅&#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 本次博文主要对如下三个视觉领域常用数据标注工具进行初步整理 labelImglabel-studio 工具Robo…

生成式AI如何辅助医药行业智能营销

生成式AI在医药行业的智能营销中发挥着日益重要的作用&#xff0c;它通过多种方式辅助医药企业提升市场洞察能力、优化营销策略、增强客户互动和体验&#xff0c;从而推动销售增长和品牌价值的提升。以下是生成式AI如何辅助医药行业智能营销的具体方式&#xff1a;一、精准市场…

微软Win11 22H2/23H2 九月可选更新KB5043145发布!

系统之家于9月27日发出最新报道&#xff0c;微软针对Windows11系统&#xff0c;发布了九月最新可选更新补丁KB5043145&#xff0c;22H2用户安装后&#xff0c;系统版本号升至22621.4249&#xff0c;23H2用户安装后升至22631.4249。本次更新修复了Edge使用IE模式有时会停止响应等…