嵌入式c语言中的位运算

位运算在嵌入中也是一个重要的点,下面就简单介绍和举一些有用的例子,如果有不足的话,请补充,废话不多说,直接开始!

位运算操作符有6个:&,|,^,~,>>,<<

&   只有1&1才等于1,其它都为0

|   只有0|0才等于0,其它都为1

^   异或,相异为1,相同为0,用来检查两个操作数的某对应位是否一致

~   非,按位反,任何数的非与数本身相加都等于-1(如果不懂的话,请查看下一篇补码)

>>  左移,相当乘以2-->左移之后,后面补零

<<  右移,相当除以2-->右移之后,对于无符号数,相应位补零,有符号数,最高位不变,其它补零

移位操作主要对外部设备的输入解码,读取信息,或者是加密

note:

1.c是专门为多数程序设计中取代汇编语言而设计的,所以c支持许多汇编操作

2.左移并不能恢复右移丢失的信息

3.一般只对unsigned int ,int ,unsigned char ,char 进行位操作,不能对浮点进行位操作!!!

4.1)左移例子:7(10)-->111(2),7左移2位,7<<2 -->111<<2-->11100-->28(10)   ==>7*2^2=28

  2)右移例子:7(10)-->111(2),7右移2位,7>>2 -->111>>2-->001-->1(10)   ==>7/2^2=1  (取整数)

5.非即是数本身的相反数据的没有加上1的补码(补码本来要加1),所以和本身相加为-1

eg:

  1 #include <stdio.h>
  2 int main()
  3 {
  4         int i = 10;     //1010
  5         int j = 7;      //0111
  6         int ret = 0;    //0  区别逻辑运算的&&和||,它们的值只能是0或1,位运算就是普通数值
  7 
  8         ret = i & j;    //0010  1&1=1,其它为0
  9         printf("ret is %d\n",ret);//2
 10 
 11         ret = i | j;    //1111  0|0 =0,其它为1
 12         printf("ret is %d\n",ret);//15
 13 
 14         ret = i << 2;   //101000  右边补零
 15         printf("ret is %d\n",ret);//40
 16 
 17         ret = i >> 2;   //0010 2 左边补零
 18         printf("ret is %d\n",ret);//2
 19 
 20         ret = i ^ j;    //异或 不同为1,其它为零 1101 --13
 21         printf("ret is %d\n",ret);//13
 22 
 23         ret = ~i;       //非(按位取反)任何的数的非与本身相加都等于-1,eg i->1010 ,j->0101 
 24         //非即是数本身的相反数据的没有加上1的补码(补码本来要加1),所以和本身相加为-1;
 25         printf("ret is %d\n",ret);//-1
 26 }



功能:将第n位变为0/1,其它位不变

注意:将第一位称为第0位!

        将第n位变为0:a & ~(1<<n)
        eg:unsigned int i = 0x9f43bda5;
              int ret = 0; 
                //将第2位变为0
              ret = i & ~(1<<2);
        
        将第n位变为1:a | (1<<n)
        eg:unsigned int i = 0x9f43bda5;
              int ret = 0;
             //将第3位变为1
              ret = i | (1 << 3);


扩展:将某些连续位变为0/1,其它位不变

方法:先计算连续位全1是多少再移位

        //将第4-9位变为1   (4-9共6位,全1-->3f)
        ret = i |(3f << 4);
        //将第3-7位变为0
        ret = i & ~(1f << 3);
        //将第1-6位和9-12位变为1
        ret = i |(f3f << 1);
 
        //将第2-8位和13-20位变为0
        ret = i & ~(7f << 2) & ~(ff << 13);


eg:
  1 #include <stdio.h>
  2 int main()
  3 {
  4         unsigned int i = 0x9f43bda5;
  5         int ret = 0; 
  6         //将第3位变为1
  7         ret = i | (1 << 3);
  8         printf("ret is %x\n",ret);
  9         
 10         //将第2位变为0
 11         ret = i & ~(1<<2);
 12         printf("ret is %x\n",ret);
 13         
 14         //将第4-9位变为1
 15         ret = i | (0x3f << 4);
 16         printf("ret is %x\n",ret);
 17         
 18         //将第3-7位变为0
 19         ret = i & ~(0x1f << 3);
 20         printf("ret is %x\n",ret);
 21         
 22         //将第1-6位和9-12位变为1
 23         ret = i |(0xf3f << 0);
 24         printf("ret is %x\n",ret);
 25         
 26         //将第2-8位和13-20位变为0
 27         ret = i & ~(0x7f << 2) & ~(0xff << 13);
 28         printf("ret is %x\n",ret);
 29 }

时间: 2024-08-05 06:55:10

嵌入式c语言中的位运算的相关文章

关于c语言中的位运算。。。

位运算是一种针对二进制数的一种运算 位运算 共有六种 都有其对应得操作符号 &      (and)      位于 |        (or)         位或 ~      (not)        取反 ^       (xor)        异或 >>    (shr)    右移一位 <<    (shl)     左移一位 运算说明: === 1. and运算 === and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可

5/30 c语言中的位运算

1.什么是位运算? 位运算是指按二进制位进行的运算.因为在系统软件中,常要处理二进制的问题.储存单元中的各二进制位左移或者右移一位,两个数按位相加等.c语言灵活,接近底层,对程序员的要求高,不像其他语言对c语言进行了封装,出错性会高很多. 2.位运算符和位运算. 运算符&按位与  ~取反 |按位或    <<左移  ^按位或   >>右移.位运算中除了~以外,均为二元元运算符,即要求两侧各有一个运算量. 3.与&的应用. 清零,无论任何一个二进制的书与上一个0000

深入理解计算机系统(2.2)---布尔代数以及C语言上的位运算

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer6.html 布尔代数上的位运算 布尔代数是一个数学知识体系,它在0和1的二进制值上演化而来的. 我们不需要去彻底的了解这个知识体系,但是里面定义了几种二进制的运算,却是我们在平时的编程过程当中也会遇到的.这四种运算分别是或.与.非和异或.下图展示了在布尔代数的知识体系中,对这四种运算的定义. 从左至右依次是非.与.或以及异或.这个图阐述的是针对一位二进制的运算结果,我们可以将其扩大到N位二进

C语言中的位拷贝与值拷贝浅谈(转载)

注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝. 位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝就是指,将原对象的值复制一份给新对象. 在用"bitwise assig

C#位运算示例和enum中的位运算

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: purview = k2|k3; // 赋给添加和删除权限 当需要判断在权限串中是否拥有某一权限时,就需要进行按位与. 如: if((purview & k1) >0)//判断此权限串是否拥有添加权限,结果>0 则进入if语句代码块中 { ....

C语言中两位ASCLL码可以表示汉字

最近偶然有人问到这个相关字符编码的问题,所以百度了下参考了这两个资料,进行了简单分析. ********************************************************************** 参考资料一:http://zhidao.baidu.com/link?url=YDoT2OLdKEElDQ86Ce_wEtKt9Nrn2yJ8TIb9JkasvaLvi8D66RRwSvxn2DkFRVM_OOnq4fCoJPA-19AmpPeypa ?"206 210

2.1 C语言下的位运算

位运算符: 注:运算量只能为整型和字符型数据,不能是实数型的数据. 当进行&运算时:0&1=0:1&0=0:1&1=1:0&0=0: 当进行|运算时:0|1=1:1|0=1:1|1=1:0|0=0: 当进行^运算时:0^1=1;1^0=1;1^1=1;0^0=0; 异或的交换: a=a^b;b=b^a;a=a^b; 证明:因为a=a^b,b=b^a,a=a^b; 所以当计算前两个时可得:b=a. 计算第三个可得到的结果为:a=b. 当进行<<运算时:如a

枚举中的位运算

为什么枚举中位运算都可以使用并运算? 1.  什么是枚举中的位运算? 例如 int a = 1 << 0; //1左移0位    1*2^0 = 1; int b = 1 << 1; //1左移1位   1*2^1 = 2; int c = 1 << 2; //1左移2位   1*2^2 = 4; int d = 1 << 3; //1左移3位   1*2^3 = 8; 并运算 a | b 01 10 -------------- 11 ==1+2 int

C/C++中的位运算

位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或).^(按位异或).~ (按位取反). 其中,按位取反运算符是单目运算符,其余均为双目运算符.     位运算符的优先级从高到低,依次为~.&.^.|, 其中~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.    (1)按位与运算符(&)