第十六天:C语言进阶之位运算及内嵌汇编

位运算在驱动开发中是经常遇到的,尤其是置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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值