最近在做一些嵌入式软件相关的工作,经常涉及到对于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寄存器位运算,位运算的一些操作相关推荐

  1. 嵌入式linux寄存器位运算,嵌入式linux C语言(一)――位运算的使用

    嵌入式linux C语言(一)――位运算的使用 ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能.在修改寄存器某些位的过程中不 ...

  2. BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的

    BMP格式知识之二:16位,24位,32位的BMP图片算法是如何运算的 原文:http://blog.csdn.net/qq445803843/article/details/46476433 这段代 ...

  3. 常用技巧 —— 位运算 —— 位运算基础

    [与运算] 与运算常用于二进制的取位操作,其用符号 & 表示,相同位的两个数字都为1,则为1,若有一个不为1,则为0. 例如:00101 & 11100 = 00100 其会将两个十进 ...

  4. 使用位运算(与运算)代替%操作

    使用位运算(&与运算)代替%操作 %运算为取余运算 由于我们知道位运算比较高效,在某些情况下,当b为2的n次方时,有如下替换公式: a % b = a & (b-1)(b=2^n) 即 ...

  5. Home_W的位运算(位运算+预处理)

    Home_W的位运算1 题目链接: 传送门解题思路:这题有两种解题思路,一种就是\(n^2\times m\)的时间复杂度,还有一种就是经过预处理的时间复杂度为\(n^2\)的方法,先说第一种,大家直 ...

  6. 关于库位“参与MRP运算”与“不参与运算”相互变动的注意事项

        一.现状 因实际业务需求,库存从"不参与MRP运算"调整为"不参与运算",反之亦然. 二.原理 1.库位是否参与MRP运算 设置库位是否参与MRP运算, ...

  7. 设变量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 ...

  8. 【FPGA】定点数 数据位宽 运算 位宽截取

    在FPGA中,经常使用定点数表示小数,在进行各种运算时,定点数的位宽会发生变化,并且需要在适当地时候对数据的位宽进行截取. 运算要求和引起的位宽变化 假设存在两个数A.B,假定A位宽为m,小数位宽为a ...

  9. java符号位_java 位运算符号

    <道生一,一生二,二生三,三生万物>出自老子的<道德经>第四十二章.主要讲述了一.二.三这几个数字,并不把一.二.三看作具体的事物和具体数量.它们只是表示"道&quo ...

  10. 寄存器某一位置位或者清零

    Linux系统宏定义: #define  BIT_MASK(nr)      ( 1UL <<  ( (nr) % BITS_PER_LONG) ) 应用一:将寄存器中的某一位置1或则清0 ...

最新文章

  1. Java程序员从笨鸟到菜鸟之(八十四)深入浅出Ajax
  2. [LeetCode] 169. Majority Element 多数元素
  3. 数据库平时错误和使用经验的总结
  4. linux socket高性能服务器处理框架
  5. usnews美国大学计算机科学排名,2019年usnews美国大学计算机科学排名
  6. sharepoint 人员搜索问题
  7. 每天固定往一个银行卡存入100元,5年之后会有多大变化?有人能坚持吗?
  8. HTML5新API记录
  9. Gradle里配置jetty实现静态资源的热部署
  10. PHP关于按位取反结果的推导过程
  11. 我的淘宝花名“九霄”
  12. Npoi 导出word控制表格水平居中
  13. 如何将pdf转化成word
  14. 设置局域网内共享磁盘
  15. 转载:mac下开启hidpi三种办法
  16. Codeforces Round #439 C.The Intriguing Obsession(组合数学)
  17. MATLAB去除矩阵中的NAN值
  18. 锂电池过充电、过放电、短路保护电路详解
  19. 「开源中国」公布 2019 年度最受欢迎中国开源软件
  20. LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)

热门文章

  1. Docker - 单独搭建部署应用服务(Nginx+Php+Mysql+Redis)
  2. Python2和python3中类型判断
  3. 笔记本双无线网卡内外网配置路由
  4. 坚鹏:苏州银行《银行数字化运营之行动篇》课程培训圆满结束
  5. Inventor冲压加强筋_inventor 加强筋教程
  6. matlab excel 新建sheet,matlab excel的sheet增加,重命名操作
  7. 电脑蓝屏终止代码及其解决方法
  8. hihoCoder1044
  9. python2.7下的urllib和urllib2
  10. 支持tcam的服务器,一种支持TCAM规则更新与压缩方法.doc