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  

Linux "yin"才们的奇"yin"小技巧 --请用东北发音夸他们的更多相关文章

  1. IDEA奇淫小技巧

    IDEA是目前市场上最好用的IDE,我说的! 前几年eclipse在市场上非常流行,因此大多数人都习惯了eclipse的一些快捷键.近年来,随着IDEA的兴起,很多人都放弃了exlipse,进而选择了 ...

  2. 教你一些Linux中隐藏bash历史命令的小技巧

    导读 如果你登录过 Linux 系统,并敲过一些命令,那你应该知道,bash history 会记录你输入的所有命令.这个操作其实是有一定风险的. 我个人经常使用 Linux,所以我想着研究一番,看看 ...

  3. 关于css布局、居中的问题以及一些小技巧

    CSS的两种经典布局 左右布局 一栏定宽,一栏自适应 <!-- html --> <div class="left">定宽</div> < ...

  4. 奇yin技巧

    关于一些奇yin技巧 关于删除字符串中的一些字串,并且考虑新的字串 例题:luogu4824 luogu3121 方法:开一个栈记录,发现字串后剪去字串长度. for(int i=1;i<=le ...

  5. Linux及FL2440使用过程遇到的各种问题和小技巧

    原文链接:http://www.cnblogs.com/NickQ/p/8900474.html ## Linux及FL2440使用过程遇到的各种问题和小技巧 关于移植linux根文件系统中的问题 在 ...

  6. Linux下wget下载软件小技巧以及安装jdk、tomcat与ftp服务器

    一.ftp的安装 装个ftp搞了一下午,感觉以前没那么麻烦的呀,结果到晚上才发现是实验室网的问题,换连手机的热点马上可以了,真是尴尬,把基本安装步骤记录一下: 1.检查安装vsftpd软件 使用如下命 ...

  7. 机器取代人类成为现实,Linux shell才可被取代?

    机器取代人类成为现实,Linux shell才可被取代? 新睿云 新睿云 新睿云-让云服务触手可及 本次笔者用通俗易懂的语言介绍一下Linux shell,由于笔者能力有限,如有有描述不准确的地方还请 ...

  8. linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

    这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...

  9. Linux的95个小技巧

    Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...

随机推荐

  1. 遇到bug如何处理

    issue中查询是否有相似bug assert / try-except / IDE单步调式 框架可以查询源码或者查询官方文档

  2. Spring Cloud Gateway(五):路由定位器 RouteLocator

    本文基于 spring cloud gateway 2.0.1 1.简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取. 同样, 该 顶 级 接口 有多 个 实现 类, ...

  3. maven引入第三方jar包

    maven有两种文件解析和分配策略,也就是我们常说的artifacts(依赖). 第一种是本地仓库,这是你缓存在本地的依赖.默认在${user.home}/.m2/repository目录下;当mav ...

  4. linux搭建代理服务器+蚁剑配置客户端代理

    一:linux搭建代理服务器 0x00 介绍 关于搭建代理服务器的方法,我也是刚刚接触,从网上找了一些能够行得通的方法来给大家做个分享: 这里我用的是Tinyproxy作为代理服务软件.这个东西很小, ...

  5. vue的ui组件库

    https://www.cnblogs.com/dupd/p/7735450.html

  6. sqlmap环境搭建

    1.安装Python2.7.12 1.1.下载Python2.7.12地址:https://www.python.org/downloads/ 1.2.环境变量配置Python2.7.11 1.3.验 ...

  7. HttpClient学习(四)—— 关于Http

    一.Http状态码 状态码分类 100 ~ 199 信息提示 200 ~ 299 成功 300 ~ 399 重定向 400 ~ 499 客户端错误 500 ~ 599 服务端错误 常见状态码 200 ...

  8. 加了https,为什么网站的有些网页是安全的,有些网页不完全安全

    加了https,为什么网站的有些网页是安全的,有些网页不完全安全 一.总结 一句话总结: 这里原因:这里出现的问题是 网站上的图片删了没找到 原因:用了http地址(自己的或者别人的)的资源 避免这类 ...

  9. Inventor2018专业版软件安装激活教程

    如果你安装的是Autodesk Inventor Professional 2018,那么序列号为:666-69696969,产品密钥为:797J1, 如果你安装的是Autodesk Inventor ...

  10. web手工项目01-系统组织框架-测试流程-需求评审-测试计划与方案

    回顾 SVN(定义,作用,使用操作) 软件缺陷(定义,表现形式,原因和根源,基本内容,跟踪流程) JIRA(基本介绍,使用者,工作流,问题,使用) 学习目标 掌握WAMP的环境搭建 掌握熟悉项目的步骤 ...