2015/12/24:嵌入式C语言的位操作随笔

今晚是平安夜,首先祝大家平安夜快乐,明天是圣诞,祝大家圣诞快乐!!  
     好了,这周都特别有空,上班也非常轻松,基本就是看看内核驱动,学学安卓,没什么正事的开发活干.今晚,我们来总结一例在现实开发中非常重要的知识点----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

}

时间: 2024-10-27 10:38:10

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

php3:跨平台的服务器端嵌入式脚本语言

      服务器端脚本技术是一种非常有用的东西,将它和客户端脚本技术联合起来应用可以 制作出功能极其强大的页面.好象很久以前有一阵子哪个版(似乎是WWW版)上讨论ASP 到了热火朝天的地步,还有人提议开个ASP版,那就是一种服务器端脚本技术. 通常用的服务器端脚本技术是CGI,NSAPI/ISAPI/FastCGI等等都是对它的改善和扩展. 至于用什么语言来实现CGI技术,没有任何规定,大家一般使用Perl,因为它的字符  功能比较强大.到了需要速度的场合,就用C来实现.    用Perl/C

《selenium2 Java 自动化测试实战(修正版)》 更新2015.12.5

java 版来了!! 本文档在<selenium2 Python 自动化测试实战>的基础上,将代码与实例替换为java ,当然,部分章节有变更.这主要更语言本身的特点有关.集合和java下两大主流单元测试框架Junit4 和 TestNG.如何通过sikuli帮助我们识别和定位元素. 自从出了Python 版的Selenium自动化测试以来,一直有同学不断询问有没有Java版的. 其实,关于Selenium的讲解,Java版的资料是最多的.目前市面的Selenium书,大多例子也是用的Java

2015/12/22:指针-函数-数组随笔

鉴于今天时间非常充足,早上发表了一篇对结构体的总结,快可以到睡觉的时刻了,明天要开始接着去上班,继续当我快乐的驱动程序员  ,在睡觉前再对一例知识点进行总结.内容不多,同时欢迎高手指正!!  请记住!没有简单的程序,只有头脑简单的程序员!!   我们学过C语言的人都知道,指针是C语言的精髓,会了指针也就真正掌握了C的精髓,鉴于在开发过程和学习过程中,不少学C的伙伴会把这几个概念混淆,进而在程序运行的时候产生"段错误"导致程序崩溃.接下来我们来看看这几个概念: 1.指针函数 2.函数指针

梦幻西游 2015新区-梦幻 2015 12月新区 上海一区 十里霓虹

问题描述 梦幻 2015 12月新区 上海一区 十里霓虹 梦幻 2015 12月新区 上海一区 十里霓虹 有没有一起玩的小伙伴 这么多年入坑 出坑 再入坑 出坑 如今又入坑了,要玩的一起吧 qq群 467443958 欢迎 解决方案 怎么游戏交友都刷到csdn上来了? 解决方案二: 顶一个,还没玩过这游戏呢 解决方案三: 听说过这个游戏,能结婚 解决方案四: 千人群欢迎大家加如 买卖东西 收售MHB DL 以及一切 只要你需要 这里帮你一站式解决!~~~只有你没有想到的 ~~~~没有群里人做不到

12个关于C语言的有趣问答_C 语言

本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下: 1.gets() 方法 问:以下代码有个被隐藏住的问题,你能找到它吗? 答:这个不显眼的问题就是使用了 gets() 方法.此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据.所以这里我们一般用 fgets() 方法将来的更好. #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeo

《中国人工智能学会通讯》——12.24 问题与挑战

12.24 问题与挑战 目前,关于时空众包技术的研究方兴未艾,还有很多研究方向值得学者们深入探索.下文简述其中 3 类潜在的研究方向,供后续研究者们参考. (1) 时空众包数据的建模问题.现有工作对时空众包的空间信息均采用网格坐标方式进行建模,并且将众包参与者在空间的移动方式简单地建模为直线移动,这并不符合现实生活中众包参与者的真实应用场景.因此,如何利用路网来建模位置信息及参与者移动方式,是未来建立时空众包数据模型的一个挑战. (2) 时空众包数据的存储与索引问题.由于时空众包应用包含大量动态

ChaiScript 4.0.0发布 C++嵌入式脚本语言

ChaiScript 是一个嵌入式脚本语言,其设计是直接针对C++++和充分利用现代C++开发技术.作为一个本地C++应用程序,它具有一定的优势超过现有的嵌入式脚本语言.它易于集成现有项目,维护C++应用程序和用户脚本之间的类型安全.它支持各种C++技术,包括回调.重载函数.类方法和STL容器. ChaiScript 4.0.0该版本增加了支持switch语句,三元运算符的支持,许多错误修正和性能改进,增强的方法和对象的自省能力,以及在单元测试的大量增加. 软件信息:http://www.cha

《测试驱动的嵌入式C语言开发》——第1章测试驱动开发

第1章 测试驱动开发我们都做过这样的事--写一大堆代码然后艰难地使它工作起来.也就是先建造再修正.测试是在代码写完之后的事情.测试总是一件后面加上来的事情,这也是我们过去唯一所知的方法.这种很难预料的过程被亲切地称为"调试"(debugging),我们可能会在其中花掉半个小时.调试的过程在我们的进度中被"测试"和"集成"粉饰起来.它总是风险和不确定的来源.修改一个bug可能导致产生另一个,有时是一系列其他的bug.我们往往会统计这些数据来预测把b

《C++面向对象高效编程(第2版)》——1.12 OOP 范式和语言

1.12 OOP 范式和语言 C++面向对象高效编程(第2版)数据抽象.封装和继承层次都是面向对象编程范式的基本概念.它们不是个别语言的专属特性,任何声称支持OOP的语言都必须支持这些范式.此外,对学习这些概念感兴趣的人不必担心特定的语言,完全可以从总体上理解这些概念(这样做甚至更好),不要将学习的重点放在钻研支持某一特性的语言语法上.一旦设计者或程序员理解了这些概念,无论学习哪一门语言的语法都非常轻松.这类似于驾驶汽车,一旦你掌握了如何驾车以及了解其中的组件如何工作,就可以把车开到任何地方--