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非正常关机的自动磁盘修复 先登录到服务器,然后在/ ...
随机推荐
- YII框架的类自动加载机制
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...
- luogu P4168 蒲公英+ 分块学习笔记
传送门 题目描述 在乡下的小路旁种着许多蒲公英,而我们的问题正是与这些蒲公英有关. 为了简化起见,我们把所有的蒲公英看成一个长度为n的序列\((a_1,a_2..a_n)\),其中 \(a_i\)为一 ...
- 微信小程序--更换用户头像/上传用户头像/更新用户头像
changeAvatar:function (){ var that=this; wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'c ...
- GCC与GDB使用
GCC基本命令 gcc[选项][文件名] -E:仅执行编译预处理(.c->.i) -S:将c代码转换成汇编代码(.i->.s) -c:仅执行编译操作,不进行连接操作(.s->.o) ...
- Collections用法总结
Collections是一个包装类,其中包含有各种有关集合操作的静态多态方,比如可以作用在List和Set上,此类不能实例化. 排序Integer[] array = new Integer[]{3, ...
- 使用多个tomcat如何修改端口号
一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.
- Python 自学笔记(七)
1.定义函数和调用函数 1-1.定义函数 定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可) 由上可以看出,函数默认返回None 2.函数的 ...
- Keil MDK 5代码补全功能设置
这段时间在用Keil5编程,经常会遇到在程序文件头部定义一个全局变量.在后面的编程过程中,经常会要用到这个变量,如果每次再打这个变量名会特别麻烦和浪费时间,我就想着Keil5有没有像vs软件一样的代码 ...
- OpenJudge计算概论-成绩判断
/*========================================================= 成绩判断 总时间限制: 1000ms 内存限制: 6000kB 描述 输入一个0 ...
- LC 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...