前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >位运算符实际应用

位运算符实际应用

作者头像
天天Lotay
发布2022-12-02 14:36:12
1930
发布2022-12-02 14:36:12
举报
文章被收录于专栏:嵌入式音视频
代码语言:javascript
复制
#include <stdio.h>

int main()
{
	// 实际应用1:使用更高效率的移位运算,代替乘除法。
	unsigned short var1 = 100;
	printf("var<<4: %hu\n", var1<<4);
	printf("var>>2: %hu\n", var1>>2);

	// 实际应用2:对2进制数据拆分、组合。
	var1 = 0x1234;	
		// 拆分 高8位:0x12   低8位:0x34
		// 方法1:操作临界数(算术运算)
	unsigned char var1_high8 = var1/0x0100;
	unsigned char var1_low8  = var1%0x0100;
	printf("1: high8:0x%hhX low8:0x%hhX\n", var1_high8, var1_low8);
		// 方法2:(适用于16位、32位、64位数据)(推荐)
	var1_high8 = (var1>>8)&0xFF;
	var1_low8  = (var1>>0)&0xFF;
	printf("2: high8:0x%hhX low8:0x%hhX\n", var1_high8, var1_low8);
	
		// 组合 0x3412
		// 方法1:算术加减
	unsigned short var2 = (var1_low8<<8) + (var1_high8);
	printf("var2: 0x%hX\n", var2);
		// 方法2:位或|拼接(推荐)
	var2 = var1_low8<<8 | var1_high8;
	printf("var2: 0x%hX\n", var2);

	// 对32位数据进行拆分组合
	unsigned int var3 = 0x12345678;
	unsigned char var3_1 = (var3>>24)&0xFF;
	unsigned char var3_2 = (var3>>16)&0xFF;
	unsigned char var3_3 = (var3>>8)&0xFF;
	unsigned char var3_4 = (var3>>0)&0xFF;
	printf("1:0x%hhX 2:0x%hhX 3:0x%hhX 4:0x%hhX\n", var3_1, var3_2, var3_3, var3_4);

	unsigned int var4 = var3_4<<24 | var3_3<<16 | var3_2<<8 | var3_1<<0;
	printf("var4: 0x%X\n", var4);

	// 实际应用3:保留其他bit,对2进制数据的某个bit位置0/置1,或者翻转指定bit。
		// 置1
	unsigned char var5 = 0x56;	
	// 位序:7654 3210
	// 		0101 0110 
	//    | 0010 0000 (1<<5)
	// ---> 0111 0110
	unsigned char var6 = var5|(1<<5);
	printf("var6: 0x%hhX\n", var6);
		// 置0
	var5 = 0x56;	
	//位序:	7654 3210
	// 		0101 0110 
	//   &	1111 1101 ~(1<<1)
	// ---> 0101 0100
	var6 = var5&(~(1<<1));
	printf("var6: 0x%hhX\n", var6);

	// 将0x56(0101 0110)第0/5/7位置1,第1/4/6位置0
	var5 = 0x56;
	// var5 = var5 |(1<<0)|(1<<5)|(1<<7);
	var5 |= (1<<0)|(1<<5)|(1<<7);	// 0xF7
	printf("var5: 0x%hhX\n", var5);

	//var5 = var5 & (~(1<<1)) & (~(1<<4)) & (~(1<<6));
	var5 &= (~(1<<1)) & (~(1<<4)) & (~(1<<6));	// A5
	printf("var5: 0x%hhX\n", var5);

	// 翻转比特
	var5 = 0x32;	
	//位序:	7654 3210
	//		0001 0010
	//    ^ 0010 0000
	//		0011 0010
	//var5 = var5 ^ (1<<5);
	var5 ^= 1<<5;	// 将第5位翻转
	printf("var5: 0x%hhX\n", var5);



	return 0;
}

代码语言:javascript
复制
#include <stdio.h>

int main()
{
	// 位逻辑反~
	char var1 = 0x3A;
	char var2 = ~var1;
	printf("~var1: 0x%hhX\n", var2);

	// 位逻辑与&
	var1 = 0x3A;			// 0011 1010
	var2 = 0x75;			// 0111 0101
	char var3 = var1&var2; //& 0011 0000  --> 0x30
	printf("var1&var2: 0x%hhX\n", var3);

	// 位逻辑或|
	var1 = 0x5C;		// 0101 1100
	var2 = 0x7D;		// 0111 1101
	var3 = var1|var2; // | 0111 1101	--> 0x7D
	printf("var1|var2: 0x%hhX\n", var3);

	// 位逻辑异或^
	var1 = 0xB4;		// 1011 0100
	var2 = 0x6D;		// 0110 1101
	var3 = var1^var2; // ^ 1101 1001	--> 0xD9
	printf("var1^var2: 0x%hhX\n", var3);

	// 左移 <<
	unsigned short var4 = 0x1234;
	unsigned short var5 = var4<<4;
	printf("var4<<4: 0x%hX\n", var5);

	// 右移 >>
	var4 = 0x1234;
	var5 = var4>>4;
	printf("var4>>4: 0x%04hX\n", var5);

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档