Linux "yin"才们的奇"yin"小技巧 --请用东北发音夸他们
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"小技巧 --请用东北发音夸他们的更多相关文章
- IDEA奇淫小技巧
IDEA是目前市场上最好用的IDE,我说的! 前几年eclipse在市场上非常流行,因此大多数人都习惯了eclipse的一些快捷键.近年来,随着IDEA的兴起,很多人都放弃了exlipse,进而选择了 ...
- 教你一些Linux中隐藏bash历史命令的小技巧
导读 如果你登录过 Linux 系统,并敲过一些命令,那你应该知道,bash history 会记录你输入的所有命令.这个操作其实是有一定风险的. 我个人经常使用 Linux,所以我想着研究一番,看看 ...
- 关于css布局、居中的问题以及一些小技巧
CSS的两种经典布局 左右布局 一栏定宽,一栏自适应 <!-- html --> <div class="left">定宽</div> < ...
- 奇yin技巧
关于一些奇yin技巧 关于删除字符串中的一些字串,并且考虑新的字串 例题:luogu4824 luogu3121 方法:开一个栈记录,发现字串后剪去字串长度. for(int i=1;i<=le ...
- Linux及FL2440使用过程遇到的各种问题和小技巧
原文链接:http://www.cnblogs.com/NickQ/p/8900474.html ## Linux及FL2440使用过程遇到的各种问题和小技巧 关于移植linux根文件系统中的问题 在 ...
- Linux下wget下载软件小技巧以及安装jdk、tomcat与ftp服务器
一.ftp的安装 装个ftp搞了一下午,感觉以前没那么麻烦的呀,结果到晚上才发现是实验室网的问题,换连手机的热点马上可以了,真是尴尬,把基本安装步骤记录一下: 1.检查安装vsftpd软件 使用如下命 ...
- 机器取代人类成为现实,Linux shell才可被取代?
机器取代人类成为现实,Linux shell才可被取代? 新睿云 新睿云 新睿云-让云服务触手可及 本次笔者用通俗易懂的语言介绍一下Linux shell,由于笔者能力有限,如有有描述不准确的地方还请 ...
- linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!
这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...
- Linux的95个小技巧
Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...
随机推荐
- P1025 数的划分——简单题刷傻系列
P1025 数的划分 学傻了,学傻了,什么dp搜索什么啊: #include<cstdio> #include<cstring> #include<algorithm&g ...
- Spring Cloud Gateway(十):网关过滤器工厂 GatewayFilterFactory
本文基于 spring cloud gateway 2.0.1 1.GatewayFilterFactory 简介 路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应. 路径过滤器的范 ...
- [Shell]Redis未授权访问反弹shell
原作者:Cream 文章出处: 贝塔安全实验室 0x01 Redis未授权访问反弹shell Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- Seata 中类SPI使用机制分析
Seata中采用了与sofa-rpc和dubbo中相同的服务扩展机制.都是基于JAVA自身的服务发现机制-SPI进行再次封装注解,sofa-rpc和dubbo(@Deprecated)中的注解名字叫做 ...
- Asis_2016_b00ks wp
目录 程序基本信息 程序漏洞 利用思路 exp脚本 参考 程序基本信息 程序漏洞 有一个读入函数,程序的所有输入都靠它读取,这个程序有个很明显的off_by_one漏洞,在输入时多输入一个0字符. 利 ...
- 我的公众号:WebHub
欢迎各位小可爱关注我的公众号WebHub(ID:myWebHub),公众号不定期更新软件行业的总结性文章,内容包括行业趋势和软件哲学,文章不谈技术只谈思想,满满干货! 此外,公众号文章同步CSDN博客 ...
- OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)
参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...
- javaScript(拼写树形)+ajax请求,去后台查找数据
第一步:页面加载完成时,利用jquery中的一函数,调用js方法,js方法,发送ajax请求,去后台查找父类权限集合,响应回来json格式的数据,对数据进行操作,往页面上添加内容 //页面初始化加载菜 ...
- OpenGL ES: (2) OpenGL ES 与 EGL、GLSL的关系
OpenGL ES 是负责 GPU 工作的,目的是通过 GPU 计算,得到一张图片,这张图片在内存中其实就是一块 buffer,存储有每个点的颜色信息等.而这张图片最终是要显示到屏幕上,所以还需要具体 ...
- PHP网络服务
[Socket] socket_create 用于创建一个Socket socket_bind 用于将IP地址和端口绑定到socket_create 函数所创建的句柄中. socket_listen ...