今晚是平安夜,首先祝大家平安夜快乐,明天是圣诞,祝大家圣诞快乐!!  

     好了,这周都特别有空,上班也非常轻松,基本就是看看内核驱动,学学安卓,没什么正事的开发活干.今晚,我们来总结一例在现实开发中非常重要的知识点----C语言的位操作。不得不说,我看到很多学习C的小伙伴都不知道到 << >> ~ !  &=~ |=这些符号的具体含义,甚至乱用,混用!!!甚至连学了几年C的都犯浑!! 所以,今天有必要再这里做这个总结,和大家一起来探讨这个常见而又难以学通的知识点。 

 

请记住!没有简单的程序,只有头脑简单的程序员!!     

这些知识点太太太太太重要了,如果你连这些都不会,你根本连踏进嵌入式开发或者从事单片机开发这个门你都进不去~~    

     


1、 符号:&

这个叫做按位与 
 

(1)位与:是在二进制中,分别对每一位进行与操作 

例如: 1110 &0011 = 0010

它的特点就是:只有1和1位与结果为1 ,其余全是0

这里特别要注意和&&逻辑与区分:位与是两个操作数按照二进制位彼此对应位相与的,逻辑与是两个操作数作为整体来相与的。

逻辑与&&:顾名思义返回值就是个逻辑值1或者0,也就是非真即假! 

例如:0xaa & 0xf0 = 0xa0 , 0xaa
&& 0xf0 = 1

2、符号:| 

这个叫做按位或 

(2)位或:是在二进制中,分别对每一位进行或操作

Ep:1110 & 0011= 1111

特点:只有两个0相或才为0,其余情况都为1,即有1为1

注意和||逻辑或区分:位或是练歌操作数按照二进制位彼此对应位相或的,逻辑或是两个操作数作为整体来相或的。

逻辑或||:顾名思义就是返回值不是真就是假,但和逻辑与就不要搞混淆咯,逻辑或只有有1就为真,全0才是假 

例如:1110 & 0011 = 1111  , 1100 & 0011 = 1

3、符号:~ 

这个叫做按位取反 

(3)位取反:位取反符号是~,是将操作数的二进制位逐个按位取反(1变成0,0变成1)

逻辑取反:逻辑取反是符号:!,即真变成假,假变成真。

4、注意:~~!!

任何非0的数被按逻辑取反再取反就会得到1

任何非0的数被按位取反再取反就会得到自己本身

5、位异或:符号是:^

1^1 = 0 , 0 ^0 = 0, 1^0 = 1 , 0^1 = 1(两个数如果相等结果为0,不等结果为1)

记忆方法:异或就是相异就或操作起来.

总结:

位与:(任何数,其实就是1或者0)与1位与无变化,与0位与变成0.

位或:(任何数,其实就是1或者0)与1位或变成1 ,与0位或无变化。

位异或:(任何数,其实就是1或者0)与1位异或会取反,与0位异或无变化。

左移位:<< 与右移位:
>>

C语言的移位要取决于数据类型。

对于无符号数,左移时右侧补0(相当于逻辑移位)

对于无符号数,右移时左侧补0(相当于逻辑移位)

对于有符号数,左移时右侧补0(叫算术移位,相当于逻辑移位)

对于有符号数,右移时左侧补符号位(正书就补0,负数就补1,叫算术移位)

在嵌入式开发中的移位,以及使用的移位属于都是无符号数

 注意啦,以下就是应用的重点!!!务必精用!!!! 

位与位或位异或在操作寄存器时的特殊作用

清位 , 取反 , 置位

&= ~         ~           |=

例如:我打个比方,在ARM-ContexA9的一个配置寄存器的方法

会了这个,其它的也就类似了!

#define  GPIOA   *(volatile unsigned int *)0x11000000

Int main(void)

{

//GPIOA &=  ~0xf;  //将寄存器的低4位清0

// GPIOA |= 0xf ;     //将寄存器的低4位置1

//GPIOA &= ~(1 << 4) ; //将寄存器的第4位清0

//GPIOA |= (1 << 4) ; //将寄存器的第4位置1

}

2015/12/24:嵌入式C语言的位操作随笔的更多相关文章

  1. 2015.12.21~2015.12.24真题回顾!-- HTML5学堂

    2015.12.21~2015.12.24真题回顾!-- HTML5学堂 山不在高,有仙则名!水不在深,有龙则灵!千里冰封,非一日之寒!IT之路,须厚积薄发!一日一小练,功成不是梦!小小技巧,尽在HT ...

  2. 2015.12.24(圣诞节) 解决Oralce数据库将具有相同属性的多行合并为一行的简单方法多年想要wmsys.wm_concat

    用到Oralce10g以后增加的函数wmsys.wm_concat 例如这张表的有两个字段,要按airport_id合并成两行可用sql语句 select airport_id,   wmsys.wm ...

  3. 2015.12.29~2015.12.30真题回顾!-- HTML5学堂

    2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...

  4. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 2)

    12天学好C语言--记录我的C语言学习之路 Day 2: 我建议大家每一天学习之前都仅凭记忆去敲前一天敲过的最后一个程序,或者敲前一天你认为最难最长的一个程序,如果一晚上的睡眠之后不看书还能敲的出来, ...

  9. Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程

    Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4. ...

随机推荐

  1. ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

    ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...

  2. ubuntu cpu频率控制

    安装cpufrequtils:  sudo apt-get install cpufrequtils 查看cpu:                 sudo cpufreq-info 设置cpu模式: ...

  3. activiti 数据库升级 upgrade

    分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 在项目中我们如果使用activiti 工作流引擎的时候,肯定是需要 ...

  4. ActiveMQ入门示例

    1.ActiveMQ下载地址 http://activemq.apache.org/download.html 2.ActiveMQ安装,下载解压之后如下目录

  5. Linux--NFS和DHCP服务器

     (1) 在网络中,时常需要进行文件的共享,如果都是在Linux系统下,可以使用NFS 来搭建文件服务器,达到文件共享的目的. (2) 在网络管理中,为了防止IP 冲突和盗用,有效的控制IP 资源 ...

  6. ubuntu权限管理常用命令

    1.chmod 第一种方式 chomd [{ugoa}{+-=}{rwx}] [文件或者目录] u 代表该文件所属用户 g 代表该文件所属用户组 o 代表访客 a 代表所有用户 +-=分别表示增加权限 ...

  7. Win7 Eclipse Hadoop2.4插件配置

    准备工作: 1.下载hadoop2x-eclipse-plugin-master.zip Github地址:https://github.com/winghc/hadoop2x-eclipse-plu ...

  8. JAVA中的静态成员

    //Java中的静态成员 /* *静态的成员变量是属于类的,不属于某个对象,是共享的. * 访问时可以用类名.静态属性直接访问,也可以用对象.访问,后者不提倡. * 静态的成员方法只能访问静态的成员 ...

  9. 读外部存储的权限READ_EXTERNAL_STORAGE

    READ_EXTERNAL_STORAGE Added in API level 16 String READ_EXTERNAL_STORAGE Allows an application to re ...

  10. oracle ORA-00917: missing comma 是因为少逗号

    oracle ORA-00917: missing comma 是因为少逗号,而且不是网上盛传的空格问题!都是传言误人啊