C语言之linux内核实现位数高低位互换

linux内核实在是博大精深,有很多优秀的算法,我之前在工作中就遇到过位数高低位交换的问题,那时候对于C语言还不是很熟练,想了很久才写出来。最近在看内核的时候看到有内核的工程师实现了这样的算法,和我之前想的一样,那么今天就把它分享出来吧。

在开发需求中,有要实现32位、16位、8位数高低位交换的算法。那么我们具体看看代码实现:

还是一样,从linux内核中将代码抠出来:

#include <stdio.h>

//将一个8位数高低4位交换
static inline unsigned char bswap_8(unsigned char v)
{
	return ((v & 0xff) << 4) | (v >> 4) ;   //将参数(v & 0xff) << 4 相当于放到高位, v >> 4 位相当于放在低位
}                                               //以下两个代码分析雷同
//将一个16位数高低8位交换
static inline unsigned short bswap_16(unsigned short v)
{
	return ((v & 0xff) << 8) | (v >> 8);
}
//将一个32位数高低16位交换
static inline unsigned int bswap_32(unsigned int v)
{
	return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
		((v & 0xff0000) >> 8) | (v >> 24);
}
int main(void)
{

	unsigned short v = 0x1000 ;
	printf("1、\n原来的v:%d\n",v);
	printf("16位数高低8位转化后的v:%d(0x%x)=========>0x%x--->%d\n",v,v ,bswap_16(v),bswap_16(v)) ;
	unsigned char  a = 0x0a  ;
	printf("\n2、\n原来的a:%d\n",a);
	printf("8位数高低4位转化后的a:%d(0x%x)==========>0x%x--->%d\n",a,a ,bswap_8(a),bswap_8(a)) ;
	unsigned int  b = 0x00001111;
	printf("\n3、\n原来的b:%d\n",b);
	printf("32位数高低16位转化后的b:%d(0x%x)========>0x%x--->%d\n",b,b ,bswap_32(b),bswap_32(b)) ;
	return 0 ;
}

运行结果:

从运行结果看,三个接口分别实现了数据高低位的交换,验证成功!

时间: 2024-10-13 21:25:34

C语言之linux内核实现位数高低位互换的相关文章

【转载】linux内核笔记之高端内存映射

原文:linux内核笔记之高端内存映射 在32位的系统上,内核使用第3GB~第4GB的线性地址空间,共1GB大小.内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的128M线性地址空间作为访问高于896M的内存的一个窗口. 引入高端内存映射这样一个概念的主要原因就是我们所安装的内存大于1G时,内核的1G线性地址空间无法建立一个完全的直接映射来触及整个物理内存空间,而对于80x86开启PAE的情况下,允许的最大物理内存可达到64G,因此内核将自己的最后128M的线

Linux内核空间-理解高端内存

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中. Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间.注意这里是32位

Linux内核三位数表示的含义

Linux内核由C语言编写,但是Linux内核并不能称为操作系统,内核只提供基本的设备驱动.文件管理.资源管理等功能.是Linux操作系统的核心组件,Linux内核可以被广泛移值,而且还对多种硬件都适用. Linux内核 版本有稳定版和开发版两种.Linux内核版本号一般由三位数字组成,比如2.6.18内核版本: 第一组数字2表示目前发布的内核主版本 第二组数字6表示稳定版本,如为奇数则表示开发中版本 第三组数字18表示修改的次数

Go语言移植Linux内核数据结构hlist

hlist(哈希链表)可以通过相应的Hash算法,迅速找到相关的链表Head及节点. 在有些应用场景,比Go标准库提供的list(一种双向链表)更合适. 依照list.h中的源码,我实现了一个Go语言版本的hlist例子. 首先说下hlist的构成:             在hlist(哈希链表)中, 头结点使用struct hlist_head来表示,hlist_head仅一个first指针. 普通节点使用struct hlist_node来表示. 源码中有几个特别的地方: 1. 在stru

C语言在linux内核中do while(0)妙用之法

为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码: #define db_error(fmt, ...) do { fprintf(stderr, "(error): "); fprintf(stderr, fmt, ##__VA_ARGS__); } while (0) 这只是个普通的调试信息的输出,有人便会认为,你这不是多此一举吗?去掉do while(0)不一样也实现了吗?其实不然,我们看看例子就清楚了,尽管很

C语言之linux内核可变参实现printf,sprintf

昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃stdio.h,全0开始实现printf , sprintf ,当然,这段代码是我在linux内核里面获取的,再经过我本人修改,移植,在DevC++这个编译环境中通过测试.我们来看看代码: #include <stdarg.h> #define NULL 0 //如果字符串中为数字,则返回数字 st

C语言之linux内核实现平方根计算算法

关于平方根的计算,在linux内核中也有实现,就像math.h数学库里的sqrt这个函数一样. 平方根的公式定义: 如果一个非负数x的平方等于a,即 , ,那么这个非负数x叫做a的算术平方根.a的算术平方根记为 ,读作"根号a",a叫做被开方数(radicand).求一个非负数a的平方根的运算叫做开平方.结论:被开方数越大,对应的算术平方根也越大(对所有正数都成立). 一个正数如果有平方根,那么必定有两个,它们互为相反数.显然,如果我们知道了这两个平方根的一个,那么就可以及时的根据相反

Linux内核高端内存 转

Linux内核地址映射模型x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图.   Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间.注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的.   Linux内核高端内存的由来 当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0xc00

Linux内核分析+子安全系统selinux+Linux的用户组和用户

一.Linux内核分析/etc/grub.conf文件 1.passwd命令 Linux以安全性和稳定性在世界上自居,在Linux发明之初就在安全领域做了很多手段,其中最简单就是提供了密码的登录和密码修改的功能,在Linux系统当中无论什么用户都必须具有密码才能登录Linux操作系统. 命令格式: passwd [用户名] 命令作用:更新或者设置用户登录的密码 2.黑客攻防:Linux单用户模式破解root密码 原因在大部分的人安装Linux的时候,很多人没有设置装载引导的密码,所以就导致黑客可