C语言开发_位运算深入练习

举报
DS小龙哥 发表于 2022/05/25 23:51:44 2022/05/25
【摘要】 介绍C语言位运算常见用法、为后续的嵌入式开发做铺垫。

任务:C语言运算符

数据的存储(练习对数据类型的深入理解)

比如:(1) 将4个字符(任何数据)存放在一个int类型的变量中。

(2) 将4个字符(任何数据)再从变量中取出来。

一个int为4个字节。

一个char为1个字节。

4个字符:’A’ ‘B’ ‘C’ ‘D’

​ 思路:

data=’A’<<’24’;

data=data|(‘B’<<’16’);

封包:将一些数据集成在一起。

解包:拆分。

​ 需要使用的运算符:<<(按位左移) , >>(按位右移) ,| (按位或) ,& (按位与)

示例:

#include <stdio.h>

int main()

{

unsigned int data=0;

unsigned char a=55;

unsigned char b=66;

unsigned char c=77;

unsigned char d=88;


/*1. 数据存储*/

data=data|(a<<24);

data=data|(b<<16);

data=data|(c<<8);

data=data|(d<<0);

// | 规则:有1得1,全0为0

// 0 规则:全1得1,有0为0

/*2. 数据拆分*/

printf("%d\n",data>>24);

printf("%d\n",(data>>16)&0xFF);

printf("%d\n",(data>>8)&0xFF);

printf("%d\n",(data>>0)&0xFF);

return 0;

}

//%c 打印字符。 一个字符1个字节

位运算符

>>

作用:按位(运算时,需要将数据转为二进制格式)向右移

规则:低位溢出,高位补0

3--->0011

15—0xF-->1111


将0xF向右移2位:

0000 1111

00000 01111

(红色部分就是补的0)

(蓝色部分就是溢出的数据)

<<

作用:按位(运算时,需要将数据转为二进制格式)向左移

规则:高位溢出,低位补0

|

作用:按位或

规则:有1得1,全0为0

0011 0100

0100 1000

0111 1100

&

作用:按位与

规则:全1为1,有0得0

​ 组合运算符

+=

data+=1; 相当于 data=data+1;

-=


|=


&=

data&=1; 相当于 data=data&1;


十进制转二进制。

比如: 3 -->0011

​ 正常使用的语句: if 、for


#include <stdio.h>

int main()

{

//

unsigned char data=8; //00001000

unsigned char i; //00010000 00001000


for(i=0;i<8;i++) //i++ == i=i+1

{

if(data&0x01)

{

printf("%d",1);

}else

{

printf("%d",0);

}

data>>=1; //移除向右移动 data=data>>1;

}

return 0;

}



基于第6题升级

修改已经存入到int变量里的值。

比如: int 内部存放了: ‘A’ ‘B’ ‘C’ ‘D’

现在需要将’C’改为’H’ ,前提条件是不能修改其他值(‘A’ ‘B’ ‘D’)。

#include <stdio.h>

int main()

{

unsigned int data=0;

unsigned char a=55;

unsigned char b=66;

unsigned char c=77;

unsigned char d=88;


/*1. 数据存储*/

data|=a<<24;

data|=b<<16;

data|=c<<8;

data|=d<<0;


/*2. 数据拆分*/

printf("%d\n",data>>24);

printf("%d\n",(data>>16)&0xFF);

printf("%d\n",(data>>8)&0xFF);

printf("%d\n",(data>>0)&0xFF);


//data: 55 66 77 88

/*3. 数据修改*/

data&=0xFF00FFFF; //清除数据

data|=0x007B0000; //加入数据123


/*4. 数据拆分*/

printf("%d\n",data>>24);

printf("%d\n",(data>>16)&0xFF);

printf("%d\n",(data>>8)&0xFF);

printf("%d\n",(data>>0)&0xFF);


return 0;

}





【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。