顾名思义,按位或和按位与是指对二进制数字中对位的操作。

按位或和按位与一般在对寄存器的操作中使用广泛,以32位系统为例,一个寄存器一般有32bit,这些bit一般会分成不同的位域,代表不同的功能。在程序中一般会通过控制这些位域来完成某一具体的功能。程序在控制某一位域时,我们不期望对其他位域产生影响,而使用|和&能方便的完成这个功能。

上图展示了一个16位寄存器的典型结构,划分为了不同的位域代表不同的含义,以bit4和bit5 DTYPE为例,这一位域也许代表着不同的数据类型。程序中也许有一个函数用于设置数据类型,那这个时候就需要配置这个位域的值来完成,并且在配置的过程中不能影响其他位域的值。

我们一般会定义一个位域掩码来屏蔽其他位的操作,例定义bit4、5位域掩码 uint_16 dtypeBitMask = 0x30 即bit4、5为1,其余全为0

第一步:read当前寄存器的值,假设为regValue

第二步:需要计算dtypeBitMask从右向左数第一个被置位的位置,这里即为4

第三步:待写的数据data左移4位,然后和dtypeBitMask 按位与,即

data = (data<<4) | dtypeBitMask

第四步:(data & dtypeBitMask) | (regValue & ~dtypeBitMask)

第五步:把第四步的值写回寄存器

所以write函数可以定义为:write(uint32_t address, uint32_t mask, uint32_t data)

关于第二步中求出第一个被置位的位置,一种做法是(c++)

#include <iostream>using namespace std;template <unsigned int N>
struct FirstSetBit
{enum { value = FirstSetBit < N << 1 >::value - 1 };
};template <>
struct FirstSetBit<0x80000000>
{enum { value = 31 };
};int main()
{cout << FirstSetBit<0x10>::value << endl;return 0;
}

上述代码的运行结果是 4

运行原理:待添加,关键字:递归调用

注:x = x & ~077的写法要比 x = x & 017700的方法好,因为后面一种写法默认位宽是16位,所以当把其移植到32bit系统中时会出错。而第一种不会有这种情况,因为~077会在编译时根据位宽求值。

C语言中按位或|和按位与的常用用法相关推荐

  1. C语言中| 按位或, || 逻辑或。

    C语言中| 按位或, || 逻辑或. 例: C语言里i=5,j=7,请问i|j等于多少? 答案:7 | 按位或 || 逻辑或 先把5和7转化为二进制 101 和 111 按位或就是 111 ,所以答案 ...

  2. c语言中按位或与按位异或的区别,C:按位与、按位或、按位异或运算

    一.按位与 & 1.概念:参加运算的两个对象,按二进制位进行"与"运算,负数按补码形式参加按位与运算. 2.规则 0&0=0; 0&1=0; 1&0 ...

  3. c语言中按位或赋值给变量,[转载]C语言位运算符在单片机上的应用

    C语言位运算符 学过汇编的朋友都知道汇编对位的处理能力是很强的,但是C语言也能对运算对象进行按位操作,从而使C语言也能具有一定的对 硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不 ...

  4. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

  5. new在c语言中的作用,C语言中new的用法

    匿名用户 1级 2012-01-26 回答 new是C++中用于动态内存分配的运算符,在C语言中一般使用malloc函数e79fa5e98193e78988e69d8331333337386663. ...

  6. break在c语言中的应用,c语言中break的用法

    C语言中break语句有以下两种用法: 1.当break语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句. 2.它可用于终止switch语句中的一个case. 如果使用 ...

  7. define 在C语言中的作用,c语言中的define用法

    作为代码中,第一个看到的,极有可能就是define这个东西,称为宏!(define是可以出现在任何地方的,但是我们一般把这个写到最开始)然而,很多时候,初学者有时候可能看不懂她,因此,我的c语言学习的 ...

  8. sprintf在c语言中的作用,c语言中sprintf的用法

    c语言中sprintf的用法的用法你知道吗?下面小编就跟你们详细介绍下c语言中sprintf的用法的用法,希望对你们有用. c语言中sprintf的用法的用法如下: sprintf函数的用法 1.该函 ...

  9. c语言 append,对C++ string append方法的常用用法详解

    C++ string append()添加文本 使用append()添加文本常用方法: 直接添加另一个完整的字符串: 如str1.append(str2); 添加另一个字符串的某一段子串: 如str1 ...

最新文章

  1. xdoj 易碎的鸟蛋(鹰蛋实验)
  2. html旋转三角菜单,css3 这个三角怎么旋转_html/css_WEB-ITnose
  3. 台湾国立大学郭彦甫Matlab教程笔记(11) advanced 2D plots 上
  4. 保留小数点后两位小数
  5. Java NIO---1
  6. (79)Verilog HDL系统函数和任务:$write
  7. 热榜第一!GitHub 标星 5.6w,用 Python 实现所有算法!
  8. 国内电动车召回12万辆有余 电池衰减和充电故障成头号问题
  9. 介绍一下unicode,ansi,utf-8,unicode big endian编码
  10. 状态压缩dp(状压dp)
  11. 生活记录:用Sai2给勾了线的图像上色
  12. d盘不能扩展卷_点读笔小档案:小达人、毛毛虫、卡米、卷之友、外研通...傻傻分不清?...
  13. 第六章 软件项目质量管理
  14. seaweedfs-client适配高版本的seaweedfs服务
  15. 用php表示掷骰子两次比大小,[宜配屋]听图阁
  16. 德银天下港交所上市:市值39亿港元 陕汽集团是大股东
  17. 谨慎处理单片机中断,中断等价于比主程序优先级更高的线程
  18. C#、.NET迷你音乐播放器
  19. Fibonacci 数列和 Lucas 数列的性质、推论及其证明
  20. 老李的RT-THREAD学习01--点灯

热门文章

  1. ARCSDE详细介绍
  2. wifi加密之 TKIP
  3. 湖北省经济和信息化委员会主任欧阳万坤调研达梦数据库
  4. HTML入门基础(004)
  5. 雷军的清华演讲-掌握你的运气
  6. 阿里云RDS Mysql 8.0 与本地主从同步
  7. centos6搭建私有云
  8. LinuxGUI自动化测试框架搭建(二十一)-截止第二十篇,如果出现以下错误,请修改代码+截止目前的全局配置文件config.py内容
  9. Ubuntu卸载软件命令
  10. PAT题集2019.5.1排名变动