(三).运算符

本文介绍了C语言中的运算符基础知识,重点讲解了移位运算符在嵌入式C中的使用,包括位置0、1的操作,以及位运算符的优先级。同时,举例说明了如何处理数值位数提取、强转、字节合并、位操作、协议帧校验和计算以及使用三目运算找最大值等实践问题。
摘要由CSDN通过智能技术生成

对于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;
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值