标签:
在嵌入式编程中,掌握位运算在操作寄存器的时候很方便,由于之前在上位运算的时候没上,但是由于位运算的难度不是很大,自己编写程序,顺便做些总结.
& | ~ 这三个位运算符号不难理解,但是要区别与逻辑运算符号&& 和||
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\n",j&k);//0000 0010 02 12 printf("j|k is %x\n",j|k);//0111 0111 77 13 printf("~j %x\n",~j);// 14 printf("~untj %x\n",~untj);// 1100 1000 c8 15 16 unsigned ret=0; 17 //将i的第4位置1 18 ret = i|(1 << 3); 19 printf("i is %x\n",i); 20 printf("ret is %x\n",ret); 21 22 //将i的第2位置0 23 ret = i& ~(1 << 2); 24 printf("i is %x\n",i); 25 printf("ret is %x\n",ret); 26 27 //将i的第4---9置1 28 ret = i|(0x3f << 4);//0011 1111 =3f 29 printf("i is %x\n",i); 30 printf("ret is %x\n",ret); 31 32 //将i的第4---9置0 33 ret = i&~(0x3f << 4);//0011 1111 =3f 34 printf("i is %x\n",i); 35 printf("ret is %x\n",ret); 36 37 //将i的第4---7置1 且12-- 15置1 38 ret = i|(0xf << 4 | 0xf << 12) ;// 1111 =f 39 printf("i is %x\n",i); 40 printf("ret is %x\n",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\n",i); 45 printf("ret is %x\n",ret); 46 47 } ~
即可。
下面是测试的代码
标签:
原文地址:http://www.cnblogs.com/hongzhunzhun/p/4501535.html