【C语言笔记】【linux宏定义系列】 判断是否2的n次幂对齐 IS_ALIGNED

linux宏定义系列内容。用于记录在linux kernel之中各式各样的宏定义☺。

宏定义说明

用于判断一个数是否是2的n次幂对齐。如果这个数是2的n次幂对齐,返回真,否则返回假。

例如判断256是否是 232^323(也就是8)对齐。

该宏定义来自linux kernel 3.10。

实现代码

#define IS_ALIGNED(x, a)     (((x) & ((typeof(x))(a) - 1)) == 0)

宏定义中:

x 表示要判断的数。

a 表示一个 2 的 n 次幂的数,如 2,4,8,16,32,64……。

注意,a 必须填入一个 2 的 n 次幂的数,否则结果未知,判断会出错。

示例程序

示例程序依次判断了 0x80000 是否是 2122^{12}212 对齐,512 是否是 256 对齐,500 是否是 256 对齐。

int main(int argc, char* argv[])
{printf("%d\n", IS_ALIGNED(0x80000, 1 << 12));printf("%d\n", IS_ALIGNED(512, 256));printf("%d\n", IS_ALIGNED(500, 256));return 0;
}

运行后,结果为:

1
1
0

表示 0x80000 是 2122^{12}212 对齐,512 是 256 对齐,500 不是 256 对齐。

实现过程

  1. (typeof(x))(a) - 1

    将数值 a 的类型转换成和数值 x 相同的类型,然后减 1。

    由于 a 是 2 的 n 次幂,减 1 之后低位全部变为 1。

    例如 a 为 8 ,二进制就是 0b1000 ,减 1 后变为 0b0111 。

  2. (x) & ((typeof(x))(a) - 1)

    将数值 x 与第一步的数值相与,高位数值将会变为 0 ,如果 x 是以 2 的 n 次幂对齐,那么低位会为 0,如果不以 2 的 n 次幂对齐,那么低位不为 0。

    例如上一步 a 为 8 ,假设 x 为 16 ,二进制就是 0b10000 ,与上一步算出的数值 0b0111 相与,就会为 0 。假设 x 为 18 ,二进制就是 0b10010 ,与数值 0b0111 相与,就会为 0b10 ,不为 0 。

  3. (((x) & ((typeof(x))(a) - 1)) == 0)

    判断是否等于 0 ,如果等于 0 ,表示是 2 的 n 次幂对齐;如果不等于 0 ,表示不是 2 的 n 次幂对齐。

[参考资料]

linux kernel 3.10

/include/linux/kernel.h


本文链接:https://blog.csdn.net/u012028275/article/details/125835426

【C语言笔记】【宏定义系列】 判断是否2的n次幂对齐相关推荐

  1. 【C语言笔记】【宏定义系列】 绝对值

    [C语言笔记][linux宏定义系列] 绝对值 abs linux宏定义系列内容.用于记录在linux之中各式各样的宏定义☺. 宏定义说明 用于计算数值的绝对值,支持有符号和无符号的long,int, ...

  2. 【C语言笔记】【宏定义系列】 向下舍入到指定数值的倍数

    [C语言笔记][宏定义系列] 向下舍入到指定数值的倍数 宏定义系列内容.用于记录各式各样有用或者没用的宏定义☺. 宏定义说明 用于将一个数向下舍入到小于等于该数的指定数值的倍数. 例如一个要向下舍入的 ...

  3. 【C语言笔记】【宏定义系列】 整数乘以分数

    [C语言笔记][linux宏定义系列] 整数乘以分数 mult_frac linux宏定义系列内容.用于记录在linux kernel之中各式各样的宏定义☺. 宏定义说明 用于将整数乘以分数.可以避免 ...

  4. 【C语言笔记】【宏定义系列】 向上取整到指定数值的倍数

    [C语言笔记][宏定义系列] 向上取整到指定数值的倍数 宏定义系列内容.用于记录各式各样有用或者没用的宏定义☺. 宏定义说明 用于将一个数向上取整到大于等于该数的指定数值的倍数. 例如一个要向上取整的 ...

  5. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解

    宏定义是用一个标识符来表示一个字符串,在宏调用中将用该字符串代替宏名.给程序员提供了便利,使程序更加清晰,便于阅读和理解,进一步提高了程序的运行效率,对于嵌入式系统而言,为了能达到性能要求,宏是一种很 ...

  6. 如何用C语言改变宏定义的大小,C语言中宏定义使用的小细节

    C语言中宏定义使用的小细节 #pragma#pragma 预处理指令详解 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#p ...

  7. c语言用宏定义常量_使用宏定义常量以在C的数组声明中使用

    c语言用宏定义常量 As we know that, while declaring an array we need to pass maximum number of elements, for ...

  8. Madagascar的宏定义函数--判断整数的奇偶性函数

    Madagascar中自己的宏定义函数判断某个整数的奇偶性,它们都在头文件rsf.h,形式如下: #define SF_ODD(n) ((n) & 1) #define SF_EVEN(n) ...

  9. c语言中宏定义的字符替换#define M(x,y,z) x*y+z

    C语言中宏定义的字符替换问题 例子: 在c语言中定义如下宏 #define M(x,y,z) x*y+z 给定如下程序 #include<stdio.h> #include<stdl ...

  10. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

最新文章

  1. flutter 局部状态和全局状态区别_给 Android 开发者的 Flutter 指南
  2. assign深拷贝_前端深拷贝和浅拷贝
  3. 成功解决AttributeError: ‘NoneType‘ object has no attribute ‘shape‘
  4. 中国新能源重卡行业十四五规划及投资可行性研究报告2022-2028年版
  5. 如何针对产品销售设计一套有效的奖励和惩罚销售措施?
  6. 常见索引结构—FST
  7. mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(
  8. bzoj 2882: 工艺【SAM】
  9. C/C++ debug(四)
  10. Struts2(一)之认识struts2
  11. 【MATLAB】MATLAB基本运算
  12. 分布式一致性—Paxos算法
  13. 自动化 夏令营 保研
  14. 2006最优秀的20款防火墙推荐
  15. 鼠标滚轮失灵上下乱窜的简单修理办法
  16. JavaScript的onfocus与onblur用法
  17. Dynamic Programming(1)
  18. 看机器学习如何还原图像色彩
  19. 基于STM32标准库的MS5837程序移植
  20. 区块链技术应用大盘点(涵盖金融、医疗、政务等领域)

热门文章

  1. 韩顺平php ecshop,ecshop教程
  2. 零点和极点到底影响了什么?什么是最小相位系统?
  3. java中如何配置前端项目,将后端或前端项目部署到云服务器上
  4. Cell综述:人类肠道菌群-从关联到调控
  5. 计算机无法安装hp网络打印机,hp打印机驱动安装失败怎么办 hp打印机驱动安装失败的解决办法...
  6. 一个人的行动力,取决于他的底层信念。
  7. 计算机视觉、图像等领域一些著名牛人和实验室(附网址)
  8. 服务器怎么用sata做系统盘,服务器sas硬盘+sata串口硬盘win2003系统安装方法
  9. 购物提醒(基于python的信息轰炸)
  10. JXT 导出数据到EXCEL