TLSF算法2:位图的相关计算

  • 一、最大非零位
  • 二、最小非零位
  • 三、某一位置1
  • 四、某一位置0
  • 五、实验验证

从上一篇文章我们知道了,在TLSF算法分配内存时,给定一个所需大小r,怎么计算出相关的二级位图的索引fl和sl,在具体讲TLSF的结构之前,我们先讲一下在有关位图操作的一些算法。主要包括32位数的最小非零位和最大非零位,和将一个32位数的某一位置0或者置1,这一共四个操作。

一、最大非零位

这个原理和上一篇文章中将到的求fl的算法一样,通过对半查找之后再采用空间换时间的方式直接在一个数组中查找出相关值就可以了。代码参考如下:

int GetMaxOBit(int n) {int a;a = n <= 0xffff ? (n <= 0xff ? 0 : 8) : (n <= 0xffffff ? 16 : 24);return TLSF_Table[n >> a] + a;
}

二、最小非零位

求一个数最小非零位的原理需要用到原码,补码,反码的知识,为了简单描述,假设是个一字节的数。为数字18为例,其二进制原码表示为“00010010”,记为a,为了表示-18,首先得出18的不包含符号位的反码是“1101101”,然后对其加1并添加上符号位,得出“11101110”,记为b,我们可以观察a和b的值,发现从低位开始直到第一个1是是相同的,其他的位都是相反的。所以实际上计算a&b,就得出值“00000010”,也就是说,将求一个数的最低非零位,就转变为了求其最高非零位。当然,也可以使用移位判断的方式求得最低有效位,但是显然,在嵌入式系统中,还是需要可以知道代码的确定执行时间的。代码参考如下:

int GetMinBit(int n) {int a = (int)n & (int)(-n);return GetMaxOBit(a);
}

三、某一位置1

这个比较简单,对1进行移位操作,知道1的位置到达需要置1的位置后,与原数进行或操作即可。代码参考如下:

int SetBit(int n,int a) {    if (n > 32){return a;} else {a |= (1<<n);return a;}
}

对超过32为的数置1的话,就不操作,返回原数即可。

四、某一位置0

对1进行移位操作,当1达到指定位置后,对这个数再进行取反操作,最后与原数进行与操作即可。代码参考如下:

int ClearBit(int n, int a) {if (n > 32){return a;} else {a &= ~(1<<n);return a;}
}

五、实验验证

整个代码如下:

#include <stdio.h>static int TLSF_Table[256];int GetMaxOBit(int n) {int a;a = n <= 0xffff ? (n <= 0xff ? 0 : 8) : (n <= 0xffffff ? 16 : 24);return TLSF_Table[n >> a] + a;
}int GetMinBit(int n) {int a = (int)n & (int)(-n);return GetMaxOBit(a);
}int SetBit(int n,int a) {  if (n > 32){return a;} else {a |= (1<<n);return a;}
}int ClearBit(int n, int a){if (n > 32){return a;} else {a &= ~(1<<n);return a;}
}main(){int i;int j = 0;int k = 0;TLSF_Table[0] = 0xffffffff;    for(i=2;i<=256;i=i*2,k++){for(;j<i;j++){TLSF_Table[j]=k;}}int a=460;int f1 = GetMinBit(a);printf("compute GetMinBit: %d\n",f1);int f2 = GetMaxOBit(a);printf("compute GetMaxOBit: %d\n", f2);int b = SetBit(9, a);printf("compute SetBit: %d\n",b);int c = ClearBit(7, a);printf("compute ClearBit: %d\n",c);}

我们仍然以数字460为例进行验证,其二进吗如下:

实验结果如下:

我们对972和332进行二进制展开得到:“1111001100”和“101001100”
其和我们预期的结果一致。

TLSF算法2:位图的相关计算相关推荐

  1. JAVA 三点定位相关计算(二,三角形质心算法)

    三角形质心算法 三圆为R1,R2,R3,圆心坐标(X1,Y1),(X2,Y2),(X3,Y3),半径分别为r1,r2,r3. 相关链接 链接: JAVA 三点定位相关计算(一,两圆关系). 1,R1, ...

  2. 融资租赁租金表、收益指标、财务分摊等相关计算原理

    本文主要介绍融资租赁业务中相关计算的原理主要包括:租金表计算.租金表变更计算.irr.xirr收益率计算.财务分摊计算等.通过案例讲解每一种算法的原理以及用excel是怎么计算出来的. 如需要看视频用 ...

  3. java中怎么计算算法的时间复杂度_算法的时间复杂度和空间复杂度计算

    一.算法的时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度.记作:T(n) ...

  4. 北科大matlab,北科大matlab第五次作业多项式及其相关计算.doc

    北科大matlab第五次作业多项式及其相关计算.doc <数学实验>报告实验名称多项式及其相关计算学院计算机与通信工程学院专业班级姓名学号2015年5月2一.[实验目的]1.学习多项式的拟 ...

  5. 计算机组成解疑补漏之SDR、DDR及相关计算

    SDRAM的相关计算以及理解SDR和DDR: 关于SDR.DDR的理解 首先,SDR的全称是SDR SDRAM,但是两个SDR的意思是完全不同的! SDRAM:Syncronous Dynamic R ...

  6. 量子计算机模型取,Grover算法在单道量子计算模型下的实现

    摘要: 量子计算机以其巨大的潜力日益得到人们的重视,而且在通向真正实用的量子计算装置的道路上,我们也取得了巨大的进步.从经典计算机的体系结构得到启示,人们提出了量子计算的量子线路模型.它基于一系列作用 ...

  7. Python基于聚类算法实现密度聚类(DBSCAN)计算

    本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算.分享给大家供大家参考,具体如下: 算法思想 基于密度的聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚 ...

  8. 计算机网络:子网划分、子网掩码、CIDR 、路由聚合相关计算详解

    目录 IPv4 的分类 IPv4 的划分 无分类编址CIDR IPv4 地址应用规划 IPv4 的分类 连接到 Internet 中的每一个主机(或路由器)都分配一个 32 比特的全球唯一的标识符,即 ...

  9. (*长期更新)软考网络工程师学习笔记——数据链路层与网络层的相关计算题

    目录 前言 一.海明码校验码的计算 二.最小帧长的计算 三.求默认网关地址 四.网络地址.主机地址.广播地址的区分和求解 五.判断是否属于网络或子网的主机地址 六.子网划分和求子网掩码 七.子网范围和 ...

  10. ip地址、子网掩码及ip地址的相关计算

    1. ip地址(iPv4)组成 IP地址=网络部分+主机部分=32位 将IP地址和子网掩码全部换算为二进制,子网掩码连续全为1的是网络地址,后面的为主机地址. 例:某主机的IP地址为:192,168. ...

最新文章

  1. 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_t
  2. NodeJS API Process全局对象
  3. Hibernate 查询数据库中的数据
  4. Swift App项目总结
  5. 云函数连接mysql超时_云函数访问MYSQL数据库出错?
  6. [NHibernate] NHibernate对象关系映射工具了解
  7. Docker常用命令、超实用、讲解清晰明了(rm、stop、start、kill、logs、diff、top、cp、restart ...)
  8. Win7和Vista移动设备正常弹出
  9. less学习-带参数混合
  10. mysql ignore用法_php – 在某些条件下在一列上使用MySQL IGNORE
  11. 付出与收获对等的自然法则,执行力离开去做马上去做
  12. 03 入门 - 安装MVC 5和创建应用程序
  13. ENVI入门系列教程---一、数据预处理---8.图像裁剪
  14. 计算点到SVM超平面的距离
  15. 怎么通过dd命令分析文件系统
  16. VS2017使用github
  17. openjtag openocd libftd2xx
  18. iMeta | 南农沈其荣团队发布微生物网络分析和可视化R包ggClusterNet
  19. java编写自动化脚本生成apk_批处理脚本实现android应用程序自动化测试
  20. 富爸爸穷爸爸的所有书籍

热门文章

  1. 经典的Java算法面试题
  2. Java算法面试题(005) 求n边形周长的k等分点坐标(今日头条)
  3. ie11安装程序无法继续 因为你的计算机,win7安装不了ie11怎么回事 win7安装不了ie11的解决方案...
  4. java 归一化_归一化方法实现(数据类型转换)
  5. 使用开票组件快速开具清单发票
  6. 【eNSP】入门介绍(很详细)
  7. python空值填充_pandas妙招之 DataFrame基础运算以及空值填充
  8. php时间格式转换成时间戳,php怎么把时间格式转换为时间戳?
  9. SPSS 数据的统计分析
  10. 公路养护工证含金量高吗?在哪报考?