ffs, fls
linux内核中的宏ffs(x)
linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在
arch/arm/include/asm/bitops.h
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
__t & -__t 等于找到__t 第一个为1的位(从低位开始),并把该位保留为1其余位清0.
例如 一32位整形数 6,用二进制表示它的低8位:00000110, 都知道负数为最高为1其余位取反加1.-6即 11111010
相与得 00000010,即6&-6. 把该值传递给函数fls().
再看fls函数.
if (__builtin_constant_p(x))
return constant_fls(x);
__builtin_constant_p 是Gcc的内建函数 ,用于判断一个值是否为编译时常数,如果参数的值是常数,函数返回 1,否则返回 0。
如果是常数就用下面函数计算00000010中1的位置
static inline int constant_fls(int x)
{
int r = ; if (!x)
return ;
if (!(x & 0xffff0000u)) {
x <<= ;
r -= ;
}
if (!(x & 0xff000000u)) {
x <<= ;
r -= ;
}
if (!(x & 0xf0000000u)) {
x <<= ;
r -= ;
}
if (!(x & 0xc0000000u)) {
x <<= ;
r -= ;
}
if (!(x & 0x80000000u)) {
x <<= ;
r -= ;
}
return r;
}
算法就是折半法,这个函数计算的是从高位起第一个1位的位置.00000010, r=2. 由于__t&-__t只有一个1,所以就是找到该1的位置.
如果输入参数是00001010 那么 r=4.
如果参数是变量,直接使用arm指令运算.
执行
asm("clz\t%0, %1" : "=r" (ret) : "r" (x) : "cc");
ret = - ret;
CLZ(Count Leading Zeros)指令对Rm中值的高位(leading zeros)个数进行计数,结果放到Rd中。若源寄存器全为0,则结果为32。若[31]为1,则结果为0。
clz指令计算高位0的个数, 然后拿32-ret 算出1的位置.
所以,ffs(x)这个宏的值就是x的第一个1的位置(从低位开始,数值从1开始,0代表x全0).
另外,该文件中还有很多linux关于位操作的函数,可以作为自己写应用程序时的有用参考.
ffs, fls的更多相关文章
- linux内核中的宏ffs(x)
linux内核中ffs(x)宏是平台相关的宏,在arm平台,该宏定义在 arch/arm/include/asm/bitops.h #define ffs(x) ({ unsigned long __ ...
- sql monitor生成不了报告& FFS hint不生效两个问题思考
事情的发生就是这么偶然,一步步的深入才能汲取到更深入的知识~~ -------------------START------------------------------------------- ...
- index ffs、index fs原理考究-1109
h2 { margin-top: 0.46cm; margin-bottom: 0.46cm; direction: ltr; line-height: 173%; text-align: justi ...
- 基于faro SDK 读取fls原始文件
#define _SCL_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include <iostream> //#include ...
- 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描
采用高速全扫描索引(index ffs) 为了避免全表扫描 参考原始: Index Fast Full Scan Usage To Avoid Full Table Scans (Doc ID 701 ...
- 2019.06.18训练日记(赞FLS)
之前打了几场比赛,有很多题没做出来,这些题无论是知识点不会,还是说在当时时间和思路的影响下没有做出来,这都应该做出来,至少现在必须做出来,本来打算专心复习,分数高了,好保研,但是想了想如果局限于只把学 ...
- 实战ffs函数
这个函数是返回整形的最低位1的位置 自己写是这个样子的: /* Find the first bit set in I. */ int lx_ffs(int i) { int index = 0, r ...
- Git FLS的使用
克隆git地址后,一些文件内容被隐藏. 显示如下: version https://git-lfs.github.com/spec/v1oid sha256:xxxxxxxxxxxxxxxxxxxxx ...
- spingMVC<1>-xml文件配置
---恢复内容开始---
随机推荐
- HTML-参考手册: HTML ASCII
ylbtech-HTML-参考手册: HTML ASCII 1.返回顶部 1. HTML ASCII 参考手册 ASCII 字符集被用于因特网上不同计算机间传输信息. ASCII 字符集 ASCII ...
- 深入解读 Redis 的持久化
Redis持久化 Java大猿帅成长手册,GitHub JavaEgg ,N线互联网开发必备技能兵器谱 Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Red ...
- nginx中root与alias关键字的区别
前言 近段时间秋招上岸了,于是每天疯狂补各种分布式基础,每天都在痛苦与快乐中度过. 在学习 nginx 的时候,遇到配置上的问题:root 与 alias 的区别,卡了大概三个小时,记录下来警醒自己不 ...
- webpack3.X的学习
文章说明,这篇主要是记录一下我学习的过程.以代码为主.一些概念啊,插件的用途说明啊不做任何说明.有任何不明白的请参照webpack中文官网https://doc.webpack-china.org/. ...
- 分布式-技术专区-Redis和MySQL缓存一致性问题
1.Redis 缓存和 MySQL 数据如何实现一致性 需求起因 缓存和数据库一致性解决方案 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操 ...
- Java-技术专区-问题专区-应该了解的基础技术点
Java基础 Arrays.sort实现原理和Collection实现原理 foreach和while的区别(编译之后) 线程池的种类,区别和使用场景 分析线程池的实现原理和线程的调度过程 线程池如何 ...
- 函数高阶(函数,改变函数this指向,高阶函数,闭包,递归)
一.函数的定义方式 1.函数声明方式 function 关键字(命名函数) 2.函数表达式(匿名函数) 3.new Function( ) var fn = new Function(‘参数1 ...
- JAXB读写xml
一.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数: name 定义这个根节点 ...
- C#排序 转
本文链接:https://blog.csdn.net/fysuccess/article/details/36416255 C#中List<T>排序的两种方法 List<Studen ...
- web.xml中配置——加载spring容器
<context-param> <param-name>contextConfigLocation</param-name> <param-value> ...