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

     好了,这周都特别有空,上班也非常轻松,基本就是看看内核驱动,学学安卓,没什么正事的开发活干.今晚,我们来总结一例在现实开发中非常重要的知识点----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. 在android系统上写C语言程序--开机启动该程序不进入安卓系统

    今天要写的这篇博文意义重大,也是网上很少有的,这是在我工作中学会的一项技术,当然,它也是由简单的问题组合而来的.如何在安卓中写C语言程序,调试安卓驱动,测试程序的的一项重要技能,下面我就不说废话了,直 ...

  2. DoesNotExist at /account/

    DoesNotExist at /account/ User has no account. Request Method: GET Request URL: http://127.0.0.1:800 ...

  3. RE模块疑问

    待处理: >>> re.findall(r'[-+]*\d+(?:\.\d+)?','-++++---+123.012') ['-++++---+123.012'] >> ...

  4. Redis中的关系查询

    本文对Redis如何保存关系型数据,以及如何对其匹配.范围.模糊查询进行举例讲解,其中模糊查询功能基于最新的2.8.9以后版本. 1 关系型数据的存储 以Staff对象为例,在关系型数据库或类似Gri ...

  5. C++语言编译系统提供的内部数据类型的自动隐式转换

    C++语言编译系统提供的内部数据类型的自动隐式转换规则如下: 程序在执行算术运算时,低类型自动隐式转换为高类型. 在函数调用时,将实参值赋给形参,系统隐式的将实参转换为形参的类型,并赋值给形参. 函数 ...

  6. 详解EBS接口开发之库存事务处理-物料批次导入

    库存事务处理-物料批次导入 --系统批次表 SELECT * FROM MTL_LOT_NUMBERS T; --API创建批次 inv_lot_api_pub.create_inv_lot(x_re ...

  7. 我的第一个RootKit,支持XP、Vista、Win7、Win8 RTM 32位

    只有写过一个BootKit,才能比较深刻的理解其整个过程与机制,也能加深对Windows系统引导各个过程的熟悉和理解. 我写的这个bootkit,暂时还没想到一个比较好的名字,它 1.  支持xp到w ...

  8. UNIX网络编程——ioctl 函数的用法详解

    1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的 ...

  9. 如何向android studio中导入第三方类库

    下面分两种情况介绍一下如何导入第三方类库. 1.对于jar的类库,直接复制进libs目录,然后把jar复制进去,然后File->Project Structure,然后选中主module的名称, ...

  10. Python Skelve 库

    在Python中有一个简单的轻量级的类似于Key-value的存储型数据库,那就是Skelve.下面就来一起看一看这个库的简单的使用吧. 小例子 我本人比较喜欢从例子出发,然后再来研究这些内部的行为. ...