位运算在驱动开发中是经常遇到的,尤其是置0和置1。既要指定的位数发生变化,又不能改变其它位的值。还要高效率的编写代码。这时候技巧就很重要了。在位运算中有几个符号: | 按位或 & 按位与 ^ 异或 ~按位非
1 #include<stdio.h> 2 3 int main() 4 { 5 int a = 0x1101; 6 int b = 0x1011; 7 int c = 9; 8 printf("a | b is %x\n",a | b); 9 printf("a & b is %x\n",a & b); 10 printf("a ^ b is %4x\n",a ^ b); 11 printf("~c is %d\n",~c); 12 13 }
结果为 a | b is 1111 a & b is 1001 a ^ b is 110 ~c is -10
前三个结果没有问题,最后一个答案要着重理解。首先 将 9 用二进制写成 0000 0000 0000 1001 取非的话就是 1111 1111 1111 0110 。因为是c是有符号位,最高一位为1表示负数,而负数在计算机中是已补码的形式表现出来的。因此要检验的话,就逆过来算,-10 写成二进制数为1000 0000 0000
1010 反码为:1111 1111 1111 0101 补码等于补码加一 则补码为:1111 1111 1111 0110 刚好就等于9取非。一个数取非的值和本身相加的值恒为-1
下面的程序就是在多个情况下置零和置一。总结下 要置零用 & 要置一用 |
1 #include<stdio.h> 2 3 int main() 4 { 5 unsigned int i = 0x9f43bda5; 6 unsigned int ret = 0; 7 printf("i %x\n",i); 8 //将 i 第3位置1 9 ret = i | ( 1 << 3 ); 10 printf("ret %x\n",ret); 11 //将 i 第2位置0 12 ret = i & ~( 1 << 2 ); 13 printf("ret %x\n",ret); 14 //将 i 第4~9位置1 15 ret = i | ( 0x3f << 4 ); 16 printf("ret %x\n",ret); 17 //将 i 第3~7位置0 18 ret = i & ~(0x1f << 3 ); 19 printf("ret %x\n",ret); 20 //将 i 第1~7和9~11位置1 21 ret = i | ( 0x3f << 1 | 7 << 9); 22 printf("ret %x\n",ret); 23 //将 i 第2~8位置13~20位置0 24 ret = i & ~( 0x7f << 2 | 0xff << 13 ); 25 printf("ret %x\n",ret); 26 }
关于内嵌汇编,就是在C语言里面写汇编程序。学习的主要目的还是让我们更加了解C内存的应用 。如果C有哪里不理解的,直接反汇编。查看汇编代码。可以帮助找错。一天的时间就把内嵌汇编的知识点说了大部分。主要是这个不是我们主要使用的语言。就像Shell一样。了解下其语言的主要语法。到时候能看得懂就可以了。下面的程序是内嵌汇编的基本雏形:
1 #inclu