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 = 32;if (!x)return 0;if (!(x & 0xffff0000u)) {x <<= 16;r -= 16;}if (!(x & 0xff000000u)) {x <<= 8;r -= 8;}if (!(x & 0xf0000000u)) {x <<= 4;r -= 4;}if (!(x & 0xc0000000u)) {x <<= 2;r -= 2;}if (!(x & 0x80000000u)) {x <<= 1;r -= 1;}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 = 32 - 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关于位操作的函数,可以作为自己写应用程序时的有用参考.

转载于:https://www.cnblogs.com/qiyuexin/p/9095161.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLSQL注册码

Product Code: 4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number: 601769 password: xs374ca

【JAVA学习】09.创建BootstrapTale列表页

【提要】只要JSON 返回了rows , total ,数据就会展示在列表 【步骤】 1、页面添加Table标签用于装载数据 <table class"table" id"userTable"> <tr><td>请输入查询条件查询</td></tr>   </table> 2、页面初始化请求…

安装ElasticSearch过程遇到的坑

采用默认安装时是可以成功安装的&#xff0c;但是只能在本机通过127.0.0.1:9200访问&#xff0c;修改: network.host: 为本机IP后&#xff0c;启动报错。 elasticsearch 5.3 安装过程中遇到了一些问题&#xff0c;这里简单记录一下 。 问题一&#xff1a;警告提示 [2016-11-…

JS的介绍

1.JS是什么 &#xff1f; JS是一门脚本语言&#xff0c;是一门解释性语言&#xff0c;是一种动态类型的语言&#xff0c;是一门基于对象的语言。 脚本语言和和编译语言的区别&#xff1a;脚本语言不需要编译&#xff0c;直接执行。编译语言是需要把代码翻译成计算机所认识的二进…

windows10上安装mysql

环境&#xff1a;windwos 10&#xff08;1511&#xff09; 64bit、mysql 5.7.14 一、下载mysql1. 在浏览器里打开mysql的官网http://www.mysql.com/2. 进入页面顶部的"Downloads"3. 打开页面底部的“Community(GPL) Downloads” 4. 在页面中间的位置找到我们windows上…

后台长期运行进程的三种方式

入门&#xff1a; nohup command > /var/log/test.log 2>&1 & 优雅&#xff1a; screen方式&#xff0c;通过screen 命令创建的环境下运行的终端命令&#xff0c;其父进程不是sshd 登陆会话&#xff0c;而是screen,这样就可以避免用户退出进程消失的问题&…

sql server 内存初探

sql server 内存初探 原文:sql server 内存初探一. 前言 对于sql server 这个产品来说&#xff0c;内存这块是最重要的一个资源&#xff0c; 当我们新建一个会话&#xff0c;相同的sql语句查询第二次查询时间往往会比第一次快&#xff0c;特别是在sql统计或大量查询数据输出时&…

hdfs查看目录大小文件大小

1、hadoop fs -du /test 查看test子目录大小 2、hadoop fs -count -q /test

使用TcpClient的例程

例子1&#xff1a; ///假定一切工作正常 ///连接后发送一次消息&#xff0c;然后不停接受消息并且打印 主要API说明 TcpClient clientnew TcpClient(); client.Connect("127.0.0.1",8888); NetworkStream streamclient.GetStream(); 发送&#xff1a; stream.Write(o…

Hawq超过最大允许连接数

Hawq默认master允许最大连接数250 segment最大连接数750 可以通过命令行或者Ambari更改连接数 1、 命令行 $ hawq config -c max_connections -v 1000 $ hawq config -c seg_max_connections -v 2000 $ hawq config -c max_prepared_transactions -v 1000 更改完成后&…

Mac原生解决ntfs格式只能读不能写

如何打开Mac OSX原生的读写NTFS功能&#xff08;支持OS X EI&#xff0c;秒杀NTFS&#xff09; 最近OS X EI更新成风&#xff0c;本人的是2014年初的macbookair&#xff0c;双系统&#xff0c;OSWIN&#xff08;仅仅用于工作需要的2个软件&#xff0c;装个bootcamp双系统稳定扎…

web api 权限控制

https://www.cnblogs.com/landeanfen/p/5287064.html 我只是个搬运工&#xff0c; 我只想存个档转载于:https://www.cnblogs.com/LoveAndPeace/p/9105037.html

Hadoop 跨集群复制文件

hadoop distcp -pbc hdfs://namenode1/test hdfs://namenode2/test 如果报用户权限写入被拒绝&#xff0c;切换到hdfs

20172324 2017-2018-2《程序设计与数据结构》实验三报告

20172324 2017-2018-2《程序设计与数据结构》实验三报告 课程&#xff1a;《程序设计与数据结构》 班级&#xff1a; 1723 姓名&#xff1a; 曾程 学号&#xff1a;20172324 实验教师&#xff1a;王志强 实验日期&#xff1a;2018年5月23日 必修/选修&#xff1a; 必修 一、实验…

Hive:hive is not allowed to impersonate anonymous

1、用kettle通过jdbc连接hiveserver2的时候抛出异常 Exception in thread "main" org.apache.hive.service.cli.HiveSQLException: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.au…

mkdir: Permission denied: user=root, access=WRITE

原因&#xff1a;root用户没有写入hdfs的权限 解决&#xff1a; 1、切换hdfs用户后&#xff0c;重新执行mkdir命令 2、修改advanced.permissions.enabled false 重启hdfs即可。 不过&#xff0c;最好切换用户执行命令。

mysql if--else

SQL之case when then用法 case具有两种格式。简单case函数和case搜索函数。 --简单case函数 case sexwhen 1 then 男when 2 then 女’else 其他 end --case搜索函数 case when sex 1 then 男when sex 2 then 女else 其他 end 这两种方式&#xff0c;可以实现相同的功能。简…

Kylin报错classnotfound:org.apache.hadoop.hive.serde2.typeinfo.typeInfo

最近新升级了最新的kylin-2.1 build cube的过程中mapreduce抛出异常 java.lang.ClassNotFoundException: org.apache.hadoop.hive.serde2.typeinfo.TypeInfo 很显然报错是指向jar包问题 在google上找到了解决了方法 find 一下sentry的位置 每个版本的hadoop上都会不一样 …

笔记41 Spring Web Flow——Demo

订购披萨的应用整体比较比较复杂&#xff0c;现拿出其中一个简化版的流程&#xff1a;即用户访问首页&#xff0c;然后输入电话号&#xff08;假定未注册&#xff09;后跳转到注册页面&#xff0c;注册完成后跳转到配送区域检查页面&#xff0c;最后再跳转回首页。通过这个简单…

星型模型和雪花型模型比较

文章转载 原文地址&#xff1a;http://blog.csdn.net/nisjlvhudy/article/details/7889422 一、概述 在多维分析的商业智能解决方案中&#xff0c;根据事实表和维度表的关系&#xff0c;又可将常见的模型分为星型模型和雪花型模型。在设计逻辑型数据的模型的时候&#xff0c…