1. include/linux/bits.h GENMASK(h, l)

/*
* Create a contiguous bitmask starting at bit position @l and ending at
* position @h. For example
* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
*/
#define GENMASK(h, l) \
(((~UL(0)) - (UL(1) << (l)) + 1) & \ ||1
(~UL(0) >> (BITS_PER_LONG - 1 - (h)))) ||2 Exp. (6,4) of 0x1111 1111
1-->0x1111 1111 - (0x1<<4) = 0x1110 1111 + 1 = 0x1111 0000
2-->0x1111 1111 >> (8-1-6) = 0x0111 1111
1&2 = 0x0111 0000

2. include/linux/bitfield.h   

/*
* Bitfield access macros
*
* FIELD_{GET,PREP} macros take as first parameter shifted mask
* from which they extract the base mask and shift amount.
* Mask must be a compilation time constant.
*
* Example:
*
* #define REG_FIELD_A GENMASK(6, 0)
* #define REG_FIELD_B BIT(7)
* #define REG_FIELD_C GENMASK(15, 8)
* #define REG_FIELD_D GENMASK(31, 16)
*
* Get:
* a = FIELD_GET(REG_FIELD_A, reg);
* b = FIELD_GET(REG_FIELD_B, reg);
*
* Set:
* reg = FIELD_PREP(REG_FIELD_A, 1) |
* FIELD_PREP(REG_FIELD_B, 0) |
* FIELD_PREP(REG_FIELD_C, c) |
* FIELD_PREP(REG_FIELD_D, 0x40);
*
* Modify:
* reg &= ~REG_FIELD_C;
* reg |= FIELD_PREP(REG_FIELD_C, c);
*/ #define __bf_shf(x) (__builtin_ffsll(x) - 1)

3.

#include <stdio.h>
#define UL (unsigned long)
#define GENMASK(h, l, H, L) \
({typeof(h) H = (h); \
typeof(l) L = (l); \
(((~UL(0)) >>(L)<< (L)) & \
(~UL(0) >> (64 - 1 - (H))));}) #define GENMASK_OLD(h, l) \
(((~UL(0)) >>(l)<< (l)) & \
(~UL(0) >> (64 - 1 - (h)))) void main(){
int i = 6, j = 4;
printf("output:%lx\n", GENMASK_OLD(6,4));
printf("output:%lx\n", GENMASK_OLD(i++,j++));
printf("output:%lx\n", GENMASK(i++,j++, H, L));
}

4. 完整测试代码,运行效率比原生态高,而且易读懂

#include <stdio.h>
#define UL (unsigned long)
#define BITS_PER_LONG sizeof(unsigned long) #define GENMASK_NEW(h, l, H, L) \
({typeof(h) H = (h); \
typeof(l) L = (l); \
(((~UL(0)) >>(L)<< (L)) & \
(~UL(0) >> (64 - 1 - (H))));}) #define GENMASK(h, l) \
(((~UL(0)) - (UL(1) << (l)) + 1) & \
(~UL(0) >> (64 - 1 - (h)))) #define GENMASK_YIN(h, l) \
(((~UL(0))>>(64-1-(h))) & \
(~UL(0))>>(l)<<(l)) void main(){
unsigned long loop1 = 1000;
unsigned long loop2 = 10000000;
int i = 6, j=4;
#if 0
printf("output:%lx\n", GENMASK_NEW(i++,j++, H, L));
i = 6; j = 4;
printf("output:%lx\n", GENMASK_NEW(++i,++j, H, L));
//org:
i = 6; j = 4;
printf("output:%lx\n", GENMASK(i++,j++));
i = 6; j = 4;
printf("output:%lx\n", GENMASK(++i,++j));
return;
#endif
//printf("GENMASK(i+1, j+1):%lx\n", GENMASK(i+1, j+1));
printf("GENMASK_NEW(i+1, j+1):%lx\n", GENMASK_NEW(i+1, j+1,H,L)); while(loop1--){
loop2 = 10000000;
while(loop2--){
//printf("%lx\n", GENMASK(6, 4));
//GENMASK(i+1, j+1);
//GENMASK_YIN(i, j);
GENMASK_NEW(i,j, H, L);
}
}
//printf("hello%ld, BITS_PER_LONG:%ld\n", sizeof UL, BITS_PER_LONG);
}

  

  

https://elixir.bootlin.com/linux/latest/source/arch/arm64/include/asm/barrier.h#L130  

最新文章

  1. 使用Unified Communications Managed API获取Lync在线会议的链接地址
  2. 利用反射模拟一个spring的内部工作原理
  3. SQLAlchemy增删改查基本操作,及SQL基本技能样码(join,group)
  4. MTK Camera 开机启动流程(转载)
  5. iTween基础之CameraFade(摄像机淡入淡出)
  6. C#UDP编程总结
  7. 推荐几个可以与PhoneGap很好搭配的UI框架
  8. WPF/Silverlight Layout 系统概述——Measure(转)
  9. hdu 4445
  10. TIDB 备忘
  11. Android Studio 3依赖配置
  12. CSS的六大选择器
  13. Zookeeper简介说明
  14. jQuery获取点击对象的父级
  15. python字符串内建函数
  16. BATJ面试必会之Java IO 篇
  17. JQuery 选择器 xpath 语法应用
  18. git rebase 过程中遇到冲突该怎么解决?
  19. 《DSP using MATLAB》示例Example 9.5
  20. es学习-java操作 2.4.0版本

热门文章

  1. zabbix (11) 监控TCP连接数
  2. linux shell下去掉windows文件的换行^M
  3. Oracle plsql 触发器 查询/启用/停止
  4. IdentityServer4入门三:授权模式
  5. sklearn中的弹性网函数 ElasticNet
  6. Mysql -- BLOB, TEXT, GEOMETRY or JSON column &#39;result&#39; can&#39;t have a default value
  7. 数据分析之 pandas
  8. RDD java API使用
  9. 用户登录之asp.net cookie的写入、读取与操作
  10. MySQL数据库备份之mysqldump