linux内核中的位运算
在linux内核中有很多位运算函数,如:set_bit,clear_bit,clear_bit,test_and_set_bit等等。
1. set_bit
static __always_inline void
set_bit(unsigned int nr, volatile unsigned long *addr)
在起始地址为addr的位图中设置第nr位;是原子操作。
2. __set_bit
static __always_inline void
set_bit(unsigned int nr, volatile unsigned long *addr)
在起始地址为addr的位图中设置第nr位;非原子操作。
3. clear_bit
static __always_inline void
clear_bit(int nr, volatile unsigned long *addr)
清除起始地址为addr的位图中的第nr位,改操作是原子操作但不具有加锁功能,若要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。
4. change_bit
static inline void change_bit(int nr, volatile unsigned long *addr)
在起始地址为addr的位图中改变第nr位;
5. test_and_set_bit
static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
在起始地址为addr的位图中设置第nr位;并返回原来的值,原子操作。
6. test_and_clear_bit
static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
在起始地址为addr的位图中清除第nr位;并返回原来的值,原子操作。
7. test_and_change_bit
static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
在起始地址为addr的位图中更改第nr位;并返回原来的值,原子操作。
8. test_bit
#define test_bit(nr, addr) \
(__builtin_constant_p((nr)) \
? constant_test_bit((nr), (addr)) \
: variable_test_bit((nr), (addr)))
根据nr是否为编译时常数来调用不同的函数,
若编译时为常数,则调用constant_test_bit
static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)
若编译时为非常数,则调用variable_test_bit
static inline int variable_test_bit(int nr, volatile const unsigned long *addr)
9. find_first_zero_bit
int find_first_zero_bit (void * addr, unsigned size)
addr为内存区的起始地址,size为要查找的最大长度,返回第一个位为0的位号
10. find_next_zero_bit
int find_next_zero_bit (void * addr, int size, int offset)
addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。
11. ffz
ffz (x):在字x中搜索第一个0。12. ffs
ffs (x): 在字x中搜索第一个已设置的位。13. hweight32
返回一个N位字的加权平衡值
14. hweight32 ( x)
x为要加权的字 ,一个数的加权平衡是这个数所有位的总和。
posted on 2011-12-18 03:44 YoungerChina 阅读(2390) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人