嵌入式C语言之位运算 &..|.~.>>

在嵌入式编程中,掌握位运算在操作寄存器的时候很方便,由于之前在上位运算的时候没上,但是由于位运算的难度不是很大,自己编写程序,顺便做些总结.

&   |   ~ 这三个位运算符号不难理解,但是要区别与逻辑运算符号&&  和||

1.需要总结的是:假如要使寄存器的值为1的话,一般用 这个寄存器的值来| 上1 比如要将i的值变为1则可以使用    i   |=  1;    意思就是将i的值与上1的值再给i。同理要让一个变量的值变成0的话,将使用 &上0     例如   i&=0;

2.但是一般寄存器都是用16进制来表示,假如要让寄存器的N位为1  只要将 1<<N位  再       |       这个数即可。假如要让寄存器的N位为0 只要将 1<<N位 ,,,取反 再  &  上这个数

 1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5     unsigned i=0x4590ab34; //01000 0101 1001 0000 1010 1011 0011 0100
  6 
  7     int j= 0x37; // 0011 0111  
  8     int k= 0x42; // 0100 0010
  9     unsigned untj=0x37;  //0011 0111
 10 
 11     printf("j&k is %x
",j&k);//0000 0010 02
 12     printf("j|k is %x
",j|k);//0111 0111 77
 13     printf("~j %x
",~j);// 
 14     printf("~untj %x
",~untj);// 1100 1000  c8
 15 
 16     unsigned ret=0;
 17     //将i的第4位置1
 18     ret = i|(1 << 3);
 19     printf("i   is %x
",i);
 20     printf("ret is %x
",ret);
 21 
 22     //将i的第2位置0
 23     ret = i& ~(1 << 2);
 24     printf("i   is %x
",i);
 25     printf("ret is %x
",ret);
 26 
 27     //将i的第4---9置1
 28     ret = i|(0x3f << 4);//0011 1111 =3f
 29     printf("i   is %x
",i);
 30     printf("ret is %x
",ret);
 31 
 32     //将i的第4---9置0
 33     ret = i&~(0x3f << 4);//0011 1111 =3f
 34     printf("i   is %x
",i);
 35     printf("ret is %x
",ret);
 36 
 37     //将i的第4---7置1 且12-- 15置1
 38     ret = i|(0xf << 4 | 0xf << 12) ;// 1111 =f
 39     printf("i   is %x
",i);
 40     printf("ret is %x
",ret);
 41 
 42     //将i的第4---9置0 且13-- 15置0
 43     ret = i&~(0x3f << 4 | 0x7 << 13) ;// 00111111 3f  0111 =7
 44     printf("i   is %x
",i);
 45     printf("ret is %x
",ret);
 46 
 47 }
~     

即可。

下面是测试的代码

原文地址:https://www.cnblogs.com/hongzhunzhun/p/4501535.html