对于C语言的运算符不在文章做过多介绍,首先要对运算符有基本的认识(参考博客资源C语言规范手册),然后就是在编程和练习的积累下就会越来越熟练。
对移位运算符的的补充,在嵌入式C中的应用比较广泛
将某一位置0或者置1里面的第n位,是从低位数的,是从0开始
将数据某一位置0 //值得注意的是在负数的位运算中,位右移相对特殊,因为负数的最高位为符号位1,所以在
m & ~(1<<n); //右移的时候最高位补符号位,而不是0,最低位舍弃,如果是 unsigned 定义的数据则不用
将数据第n位和n+1位置0//考虑
m & ~(3 << n);
将数据的某一位置1
m | (1 << n)
将数据第n位和n+1位置1
m | (3 << n)
将数据第n位和n+1位置01 -- 先将第n位和第n+1置0然后单独设置1
m & ~(3 << n) | (1 << n+1)
运算符优先级
()
单目:++ -- ~ !
双目:算术 << >> 关系 &|^ 逻辑
三目运算符
复合
逗号
练习
1.提取数值位数,根据权重
#include<stdio.h>
#include<math.h>
int main()
{
int a=0x3afe,b[4];//没有二进制的输出,16进制输出的格式控制符位%d,八进制的格式控制符为%0
b[0]=a/(16*16*16);
b[1]=a/(16*16)%16;
b[2]=a/16%16;
b[3]=a%16;
printf("%x %x %x %x",b[0],b[1],b[2],b[3]);
return 0;
}
2.收到的数据是一个小数;但是我想要他的整数部分; -- 强转
#include<stdio.h>
#include<math.h>
int main()
{
float a;
scanf("%f",&a);
printf("%d",(int)a);
return 0;
}#include<stdio.h>
#include<math.h>
int main()
{
float a;
scanf("%f",&a);
printf("%d",(int)a);
return 0;
}
3.收到的内容是两个字节长度,但是我想要他的低八位-- 放入到小的数据类型中 unsigend short b = 0xf1fa;
#include<stdio.h>
#include<math.h>
int main()
{
unsigned short b = 0xf1fa;
unsigned char a=b;
printf("%x",a);
}
4.用户输入两个数据,如果第一个数据能被第二个数据整除,就打印OK,不能整除就打印NO
#include<stdio.h>
#include<math.h>
int main()
{
int a,b;
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
a%b==0?printf("OK"):printf("NO");
}
5.取u16 a = 0xaabb的低八位,取u16 b = 0xccdd的中八位,取u16 c = 0xeeff的高八位,合成一个数0xeecdbb
#include<stdio.h>
#include<math.h>
int main()
{
unsigned short a=0xaabb;//低八位
unsigned short b=0xccdd;//中八位
unsigned short c=0xeeff;//高八位
unsigned int d[3],num;
d[0]=a&255;
d[1]=b&~(15<<12)&~15;
d[2]=c&~255;
d[1]=d[1]<<4;
d[2]=d[2]<<8;
num=d[0]+d[1]+d[2];
printf("%x",num);
}
6.编写程序需求如下:
定义一个变量,u32 a;将其二进制位4号位变为0,其他位不变写程完成
定义一个变量,u32 b;将其二进制位4号位变为1,其他位不变写程完成
定义一个变量,u32 c;将其二进制位4 和 5号位变为00,其他位不变写程完成
定义一个变量,u32 d;将其二进制位4 和 5号位变为10,其他位不变写程完成
#include<stdio.h>
#include<math.h>
int main()
{
unsigned int a=0;
a=a&~(1<<4);
unsigned int b=0;
b=b|(1<<4);
unsigned int c=0;
c=c&~(3<<4);
unsigned int d=0;
d=d|(1<<4)&~(1<<5);
printf("0x%x\n0x%x\n0x%x\nox%x\n",a,b,c,d);
return 0;
}
7.某个协议帧如下
要发送数据位 0xfa 0xfb 0xfc 0xfd 0xff 和 校验和(之前发送数据的和取低八位)
请计算出要发送的校验和并且打印;
#include<stdio.h>
#include<math.h>
int main()
{
unsigned char a[5]={0xfa,0xfb,0xfc,0xfd,0xff},num;
unsigned int i;
for(i=0;i<5;i++)
num=num+a[i];
printf("%x",num);
return 0;
}
8.用户输入两个数,打印最大的数--用三目运算
用户输入三个数,打印最大的数--用三目运算
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c;
printf("请输入两个数:");
scanf("%d%d",&a,&b);
a>b?printf("%d\n",a):printf("%d\n",b);
printf("请输入三个数:");
scanf("%d%d%d",&a,&b,&c);
a>b?(a>c?printf("%d\n",a):printf("%d\n",c)):(b>c?printf("%d\n",b):printf("%d\n",c));
return 0;
}