Linux系统位运算函数以及相应CPU ISA实现收录

news2024/11/22 19:08:13

以32位数据的二进制表示为例,习惯的写法是LSB在左,MSB在右,注意BIT序和大小端的字节序没有关系。

Linux和BIT操作有关的接口在定义在头文件bitops.h中,bitops.h定义有两层,通用层和架构层,对应两个bitops.h,通用层的定义在./include/linux/bitops.h中,架构层和处理器类型有关,定义在./arch/$ARCH/include/asm/bitops.h中。

除了这两个之外,实际上还有一个不常用到的include/asm-generic/bitops.h,这个头文件一般只能被include/linux/bitops.h引用

所以引用关系可以表示为:

arch目录下的bitops.h定义也仅允许被./include/linux/bitops.h引用。

如果./include/asm-generic/下的头文件没有直接被./include/linux/bitops.h引用,则也可以被ARCH下的头文件直接引用./arch/$ARCH/include/asm/bitops.h

下面分别介绍每个BITOPS函数:

ffs

ffs意思是Find First bit Set in word(From LSB to MSB).BIT从1开始记,返回值是[1,32],当输入0值时,返回是0,也就是ffs(0) = 0;ffs(1)=1, ffs(0x80000000)=32;

__ffs

__ffs意思同样是Find First bit Set in word.(From LSB to MSB).与ffs不同的是,__ffs从0开始记数。由于返回0表示的是bit 0为1,所以没有一个合理返回值表达__ffs(0),所以__ffs(0)没有定义,应用必须自行主动判断为0的情况,保证输入__ffs的参数为非0值。__ffs(0)=Undefined. __ffs(1) = 0; __ffs(0x80000000)=31;

__ffs/ffs相互实现:

int ffs(int x)
{
    if (!x) return 0;
    return __ffs(x) + 1;
}
 
int __ffs(int x)
{
    return ffs(x) - 1;
}

__ffs对参数的要求条件要强于ffs,所以_ffs的参数可以直接传给ffs,但是ffs的参数需要做0检查才能传递给__ffs。有点类似于C++基类和子类前置条件和后置条件的关系。

ffz

ffz means Find First Zero in word. 值域范围为[0,31].如果输入为0xFFFFFFFF,则结果未定义。在调用前,应用层因该进行条件检查。

ffz恰好是_ffs的逆运算而非ffs的逆运算。所以可以通过_ffs来实现ffz

#define ffz(x) _ffs(~(x))

clz

clz means "Count Leading Zeroes".计算前导0的个数,它从最高有效位(MSB)开始计算第一个位之前存在多少个零。在有些架构的处理器中,专门定义了"clz"指令用来完成此类运算,比如MIPS。

clz是下面将要介绍的fls的小伙伴和好助手,通过clz实现fls非常的简单和方便。由于它是一个计数值而非一个位置,所以值域并非前面的[0,31]或者[1,32],而是[0,32]. czl[0] = 32, czl(0xFFFFFFFF)=0,

clz(0x1)=31; clz(0x80000000)=0;

fls

fls means Find Last(Most Significant) bit set.和ffs恰恰相反,fls从LSB开始查找,找到最后一个值1的位,并返回其位置。值域为[1,32]. fls(0) = 0; fls(1) = 1; fls(0x80000000) = 32;

fls可以通过clz实现:

fls(x) = 32-clz(x);

__fls

如同ffs和__ffs的关系一样,__fls也可以通过fls减1实现。同样对于0值,__fls不知如何处理,需要应用负责判断。

int __fls(unsigned long x)
{
    if(!x) return 0;
    else return fls(x) - 1;
}

hweight_long/hweight32/hweight64

返回一个数字的加权平衡值,一个数的加权平衡是这个数所有位的总和。定义在文件include/asm-generic/bitops/const_hweight.h

#include <stdio.h>
#include <stdlib.h>
#include "include/asm-generic/bitops/const_hweight.h"
 
int main(void)
{
        printf("%s line %d, %d, %d, %d.\n", __func__, __LINE__, hweight32(0), hweight32(0xffffffff), hweight32(0x08000000));
        return 0;
}

find_first_zero_bit

在内存中查找第一个值为0的位。

find_next_zero_bit

在内存中查找下一个值为0的位

结束


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

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

相关文章

【重要】2023年上半年有三AI新课程规划出炉,讲师持续招募中!

2023年正式起航&#xff0c;想必大家都已经完全投入到了工作状态中&#xff0c;有三AI平台今年将在已有内容的基础上&#xff0c;继续进行新课程开发&#xff0c;本次我们来介绍今年上半年的课程计划&#xff0c;以及新讲师招募计划。2023年新上线课程我们平台的课程当前分为两…

【Python爬虫案例】批量采集网站壁纸,实现自动更换桌面壁纸

前言 美照天天换&#xff0c;才不会腻 不知道你们是不是这样&#xff0c;我的手机壁纸电脑壁纸&#xff0c;隔三岔五就喜欢换&#xff0c;看久了 我就腻了&#xff0c;索性就用python把这个网站的壁纸都采集下来&#xff0c;顺便再让电脑自动更换我的桌面壁纸 ~ 一篇文章教会…

【AI简报第20230210期】 ChatGPT爆火背后、为AIoT和边缘侧AI喂算力的RISC-V

1. ChatGPT爆火背后&#xff1a;AI芯片迎接算力新挑战原文:https://www.163.com/dy/article/HT7BHN3C05199NPP.htmlChatGPT的出圈走红为AIGC打开全新市场增量&#xff0c;催生了更高的算力需求。作为人工智能三大核心要素之一&#xff0c;算力也被誉为人工智能“发动机”。华泰…

使用服务器搭建alist和webdav

docker镜像官网&#xff1a;https://hub.docker.com/r/xhofe/alist 一、准备工作 环境&#xff1a;centos7、docker 二、步骤 1.拉取alist镜像 在根目录下执行以下命令&#xff1a; docker pull xhofe/alist:latest2.运行alist docker run -d --restartalways -v /etc/ali…

互联网医院源码 线上问诊 智慧医院源码 C#源码

互联网医院平台源码 智慧医院管理系统源码 开发环境&#xff1a;ASP.NET C# VS2019 SQL2008 依托于实体医院利用互联网技术对接院内业务信息系统&#xff0c;向患者提供基于线上问诊、预约挂号、缴费结算、医患互动、诊后随访、健康科普和复诊等全面的医疗健康互联网服务。…

一文读懂 Zebec Chain 的“先行网络” Nautilus 链

最近&#xff0c;Zebec上线了DAO治理系统后&#xff0c;上线并通过了关于Nautilus链的提案&#xff0c;这也是DAO系统上线后通过的首个提案。Nautilus链可以被看作是Zebec Chain上线前的“先行”链&#xff0c;并且是目前行业内为数不多的以“Layer3”作为特点的模块化通用链&a…

花2到5块钱注册体验chatgpt

最近很火的chatGPT不对中国开放&#xff0c;简直太坑了。不过网上也有很多例子去如何注册&#xff0c; 1. 需要可以上网的非中国IP。 有梯子的也可以&#xff0c; 我是某宝3块钱租了一个一天体验的国外服务器&#xff0c;可以查阅资料&#xff0c;有需要可以直接去淘。 2.一个…

vsCode添加右击打开文件夹或者文件功能

1. 前言 vsCode有两种安装方式&#xff0c;通过exe执行安装或者绿色版的软件安装。如果使用绿色版软件&#xff0c;不会自动右击文件夹用vscode打开。此时就需要通过修改注册表的方式进行操作。 2. 修改注册表 2.1 打开注册表 win r regedit2.2 右击文件用vscode打开 找到…

I.MX6ULL内核开发4:设备号的组成与哈希表

目录 一、设备号 二、hash table 一、设备号 文件夹&#xff1a;/home/geralt/linux_driver/kernel/ebf_linux_kernel_6ull_depth1/include/linux/kdev.h 这里面是linux中关于设备号的具体描述 #define MINORBITS 20 #define MINORMASK ((1U << MINORBITS) - 1)#defin…

【C++】十、继承

一、继承的概念及定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#xff…

Flink CEP 新特性进展与在实时风控场景的落地

摘要&#xff1a;本文整理自阿里云开发工程师耿飙&阿里云开发工程师胡俊涛&#xff0c;在 FFA 实时风控专场的分享。本篇内容主要分为四个部分&#xff1a;Flink CEP 介绍&新功能解读动态多规则支持与 DemoFlink CEP SQL 语法增强未来规划■ 分享中的动态 CEP 和 CEP S…

mysql面试题(集合)

mysql如何实现索引机制 mysql中索引分三类&#xff1a;B树索引、Hash索引、全文索引 InnoDB索引与MYISAM索引实现的区别是什么 1.InnoDB的辅助索引data域存储相应记录主键的值而不是地址 2.InnoDB的数据文件本身就是主索引文件 3.MyISAM的索引和数据是分开存储的 一个表中如…

ChatGPT 来了,你准备好了吗?

周三的晚上&#xff0c;我做了一次直播&#xff0c;题目叫做《ChatGPT 来了&#xff0c;老师和同学们准备好了吗&#xff1f;》。如果你还没看&#xff0c;欢迎看看回放视频。做这次直播&#xff0c;是因为受了三重刺激。第一重&#xff0c;来自于我的一位好友&#xff0c;也是…

自上而下的传输协议-TCP/IP 的演化

动机来自昨天下班路上快到家发的一则朋友圈&#xff1a; 作为因果的历史是不存在的。因为有无数种对等的解释。这个可以用拓扑学证明的&#xff0c;模型非常简单&#xff0c;事件作为点&#xff0c;事件之间的关系作为连接两点的有向边。 最近思考一个问题&#xff0c;传输协…

MongoDB 更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。 update() 方法 update() 方法用于更新已存在的文档。语法格式如下&#xff1a; db.collection.update(<query>,<update>,{upsert: <boolean>,multi: <boolean>,writeConcern: <document…

移除元素-力扣27-java

一、题目描述给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新…

数据与C(整数存储的各种类型)

目录 一.int&#xff08;%d&#xff09; 1.sizeof应用 2.声明int变量以及初始化 3.打印int值 二.short&#xff08;%hd&#xff09;和long(%ld) 1.short大小 2.long大小 3.short和long的分支 三.综合讲解 四.整数类型总结 五.可移植类型&#xff1a; stdint.h 和 in…

年轻人越来越反感“专家”,问题出在哪儿?

专家的建议&#xff0c;又惹怒了年轻人。 最近&#xff0c;某学者表示&#xff0c;在鼓励年轻人生育、婚恋的问题上&#xff0c;可以将法定结婚年龄下调至18岁&#xff0c;以此降低成婚门槛促进单身男女建立家庭。 此话一出&#xff0c;立刻引来无数板砖。不少人质疑&#xf…

CrossOver2023mac跨系统互通切换win虚拟机

CrossOver2023版是在Mac上运行Win软件的最简单方法&#xff0c;有了它&#xff0c;你无须 Win许可、重新启动或使用虚拟机即可在mac上使用Win软件。CrossOver23可以轻松地从Dock本地启动Win程序。CrossOver版还集成了macOS 功能&#xff0c;例如跨平台复制和粘贴&#xff0c;以…

数据与C(ASCII码,char)

目录 一.ASCII码讲解 二.非打印字符&#xff08;转义字符&#xff09; 三.扩展小知识 一.ASCII码讲解 char类型用于存储字符&#xff0c;从技术层面看&#xff0c;char时整数类型&#xff0c;因为char类型实际上存储的是整数而不是字符。计算机使用数字编码来处理字符&…