linux寄存器位运算,位运算的一些操作
最近在做一些嵌入式软件相关的工作,经常涉及到对于FPGA寄存器的相关操作。而对于寄存器的操作,软件这边通常是把数据进行组装为一个固定位宽(8bit, 16bit)的数通过localbus总线写到寄存器中。
1. 原码,反码,补码
计算机中的数据都是以二进制的形式进行存储的,确切的说是以二进制补码的形式进行存储的。
正数:对于一个正数来说,其原码,反码,补码均为其自身。
负数:对于一个负数,在C语言里面,char类型占据一个字节,8位,大小是-128~127。反码是符号位保持
不变,其他的变为相反。补码则是在反码的基础上在低位加上1。
注意,-128这一类型的数是没有原码和反码的,只有补码。
补充:+0,-0的原码,反码,补码
+0 00000000 00000000 00000000
-0 10000000 111111111 00000000
2. 位运算的基本运算符
如图所示的是位运算的四个符号。
image.png
按位取反:~(10011010) = 01100101
按位与: (10010011)& (00111101) = 00010001
按位或: (10010011) | (00111101) = 10111111
按位异或: (10010011) ^ (00111101) = 10101110
左移:(10001010)<< 2 = 00101000
右移: (10001010) >> 2 = 11100010
不管是有符号书还是无符号数,左移的话,直接丢弃高位,0补最低位。右移的话,符号位会保持不变
对于有符号数,右移之后会在最高位补1。
3. 位运算的常见用法
数据拼接
在嵌入式中,数据通常写到8bit或者16bit的寄存器中,因此对于每一bit都要赋予相应的值以供逻辑(FPGA)使用。如一个16bit的寄存器,需要存储的数据是2bit的命令,6bit的地址,8bit的具体数据。而此时给出的命令,地址以及具体数据均为一个unsigned int型(32位,但是有效位分别只有2,6,8)的数据。
unsigned int cmd = 0x1; unsigned int addr = 0x8; unsigned int data = 0xff;
命令,地址,数据在寄存器中以高位到低位的方式进行存储。
那么该16bit寄存器数据可以表示为
unsigned int regData = ((cmd << 14) & 0xffff) + ((addr << 8) & 0xffff) + ((data) & 0xffff);
其实本质就是通过数据的移位将需要到数据bit放到组合后数据相应的位中去即可。
linux寄存器位运算,位运算的一些操作相关推荐
- 嵌入式linux寄存器位运算,嵌入式linux C语言(一)――位运算的使用
嵌入式linux C语言(一)――位运算的使用 ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能.在修改寄存器某些位的过程中不 ...
- BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的
BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的 原文:http://blog.csdn.net/qq445803843/article/details/46476433 这段代 ...
- 常用技巧 —— 位运算 —— 位运算基础
[与运算] 与运算常用于二进制的取位操作,其用符号 & 表示,相同位的两个数字都为1,则为1,若有一个不为1,则为0. 例如:00101 & 11100 = 00100 其会将两个十进 ...
- 使用位运算(与运算)代替%操作
使用位运算(&与运算)代替%操作 %运算为取余运算 由于我们知道位运算比较高效,在某些情况下,当b为2的n次方时,有如下替换公式: a % b = a & (b-1)(b=2^n) 即 ...
- Home_W的位运算(位运算+预处理)
Home_W的位运算1 题目链接: 传送门解题思路:这题有两种解题思路,一种就是\(n^2\times m\)的时间复杂度,还有一种就是经过预处理的时间复杂度为\(n^2\)的方法,先说第一种,大家直 ...
- 关于库位“参与MRP运算”与“不参与运算”相互变动的注意事项
一.现状 因实际业务需求,库存从"不参与MRP运算"调整为"不参与运算",反之亦然. 二.原理 1.库位是否参与MRP运算 设置库位是否参与MRP运算, ...
- 设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五人运算的表达式是: A) n=(n*100+0.5)/100.0 B)m=n*100+0.5
设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五人运算的表达式是: A) n=(n100+0.5)/100.0 B)m=n100+0.5 ,n= m ...
- 【FPGA】定点数 数据位宽 运算 位宽截取
在FPGA中,经常使用定点数表示小数,在进行各种运算时,定点数的位宽会发生变化,并且需要在适当地时候对数据的位宽进行截取. 运算要求和引起的位宽变化 假设存在两个数A.B,假定A位宽为m,小数位宽为a ...
- java符号位_java 位运算符号
<道生一,一生二,二生三,三生万物>出自老子的<道德经>第四十二章.主要讲述了一.二.三这几个数字,并不把一.二.三看作具体的事物和具体数量.它们只是表示"道&quo ...
- 寄存器某一位置位或者清零
Linux系统宏定义: #define BIT_MASK(nr) ( 1UL << ( (nr) % BITS_PER_LONG) ) 应用一:将寄存器中的某一位置1或则清0 ...
最新文章
- Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax
- [LeetCode] 169. Majority Element 多数元素
- 数据库平时错误和使用经验的总结
- linux socket高性能服务器处理框架
- usnews美国大学计算机科学排名,2019年usnews美国大学计算机科学排名
- sharepoint 人员搜索问题
- 每天固定往一个银行卡存入100元,5年之后会有多大变化?有人能坚持吗?
- HTML5新API记录
- Gradle里配置jetty实现静态资源的热部署
- PHP关于按位取反结果的推导过程
- 我的淘宝花名“九霄”
- Npoi 导出word控制表格水平居中
- 如何将pdf转化成word
- 设置局域网内共享磁盘
- 转载:mac下开启hidpi三种办法
- Codeforces Round #439 C.The Intriguing Obsession(组合数学)
- MATLAB去除矩阵中的NAN值
- 锂电池过充电、过放电、短路保护电路详解
- 「开源中国」公布 2019 年度最受欢迎中国开源软件
- LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)
热门文章
- Docker - 单独搭建部署应用服务(Nginx+Php+Mysql+Redis)
- Python2和python3中类型判断
- 笔记本双无线网卡内外网配置路由
- 坚鹏:苏州银行《银行数字化运营之行动篇》课程培训圆满结束
- Inventor冲压加强筋_inventor 加强筋教程
- matlab excel 新建sheet,matlab excel的sheet增加,重命名操作
- 电脑蓝屏终止代码及其解决方法
- hihoCoder1044
- python2.7下的urllib和urllib2
- 支持tcam的服务器,一种支持TCAM规则更新与压缩方法.doc