Linux-位图DECLARE_BITMAP宏

位图简介

  • 位图:用每一个bit来表示一个含义。比如你需要标记32个资源的占用情况,可以用一个int型变量(刚好32bit)来标记,bit位为0代表资源空闲,bit为1表示资源被占用,你通过位运算检查每个bit的值就知道对应资源的占用情况。

DECLARE_BITMAP定义

在内核中我们经常看到位图结构,我们先来看看其定义:


#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))  //向上取整


#define BITS_PER_BYTE		8

#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))


#define DECLARE_BITMAP(name,bits)  \
	unsigned long name[BITS_TO_LONGS(bits)]
  • 宏的定义是用来定义一个位图变量,本质就是一个unsigned long类型的数组。比如你要标记38个资源,但是一个unsigned long类型变量只有32bit(32位系统中),所以就要定义2个unsigned long类型变量(总共有64bit),但是实际只用到38bit;在64位系统中long类型就有64位,所以表示38个资源也是绰绰有余的,超过64个资源就需要两个long类型的变量了,以此类推。
  • 宏的参数:name是变量名,bits是位图有多少个位,就是需要多少个bit;

宏展开

如上图定义,我们一层层展开:


#define MAX_GENERATION_NUMBER  127
#define BITS_PER_BYTE		8


DECLARE_BITMAP(bit_string, MAX_GENERATION_NUMBER + 1);
	unsigned long bit_string[BITS_TO_LONGS(128)]
    	unsigned long bit_string[DIV_ROUND_UP(128, 8 * 4)] (这里按照32位来计算)
        	unsigned long bit_string[DIV_ROUND_UP(128, 32)]
            	unsigned long bit_string[(((128) + (32) - 1) / (32))]
                	unsigned long bit_string[4]

  • 这里以32位系统来计算,32位系统中sizeof(long)就是32位
  • 从上面我们可以看到,DECLARE_BITMAP(bit_string,MAX_GENERATION_NUMBER + 1)最终展开成了unsigned long bit_string[4]这个数组,4个unsigned long就可以代表128位了。如果是129个资源,那么计算下来就需要5个unsigned long来表示了(160位),但其实只用了129位。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请用中文解释如下代码:bool LslidarDriver::loadParameters() { pubscan_thread_ = new boost::thread(boost::bind(&LslidarDriver::pubScanThread, this)); interface_selection = std::string("net"); frame_id = std::string("laser_link"); scan_topic = std::string("/scan"); lidar_name = std::string("M10"); is_start = true; min_range = 0.3; max_range = 100.0; use_gps_ts = true; angle_disable_min = 0.0; angle_disable_max = 0.0; truncated_mode_ = 0; ceil_increase=0; this->declare_parameter<std::string>("lidar_name","M10"); this->declare_parameter<std::string>("frame_id","laser_link"); this->declare_parameter<std::string>("scan_topic","/scan"); this->declare_parameter<double>("min_range",0.3); this->declare_parameter<double>("max_range",100.0); this->declare_parameter<bool>("use_gps_ts",false); this->declare_parameter<double>("angle_disable_min",0.0); this->declare_parameter<double>("angle_disable_max",0.0); this->declare_parameter<std::string>("interface_selection","net"); this->declare_parameter<int>("truncated_mode_",0); this->declare_parameter<int>("ceil_increase",0); this->get_parameter("lidar_name", lidar_name); this->get_parameter("frame_id", frame_id); this->get_parameter("scan_topic", scan_topic); this->get_parameter("min_range", min_range); this->get_parameter("max_range", max_range); this->get_parameter("use_gps_ts", use_gps_ts); this->get_parameter("angle_disable_min", angle_disable_min); this->get_parameter("angle_disable_max", angle_disable_max); this->get_parameter("interface_selection", interface_selection); this->get_parameter("truncated_mode_", truncated_mode_); this->get_parameter("ceil_increase", truncated_mode_); while(angle_disable_min<0) angle_disable_min+=360; while(angle_disable_max<0) angle_disable_max+=360; while(angle_disable_min>360) angle_disable_min-=360; while(angle_disable_max>360) angle_disable_max-=360;
07-15

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值