嵌入式想进大厂?这些位运算你了解多少?

😄在进行嵌入式开发时,位运算的应用是必不可少的,而位运算不仅作用在嵌入式
开发中,在进行游戏开发时也非常重要,毕竟是直接对bit进行操作,效率要快很多。今
天就与我一起用一篇博客带你进一步了解位运算在嵌入式开发中的实例。🚀🚀🚀

搞懂 C 语言的凌波微步-位操作 :

在这里插入图片描述

  1. 快速掌握 C 语言的底层技能-位操作
  2. 快速掌握大厂笔试中的位操作
  3. 快速掌握企业开发中的位操作

1.为什么要使用位操作:

在这里插入图片描述

大厂笔试题 1(难度系数 1)

题目描述 给定两个十进制数字,求它们二进制表示的汉明距离(Hamming distance,即不同位的个数)。

	实例:	Input: x = 1, y = 4 
			1: 0000 0001 
			4: 0000 0100
			---------------------------------------------------------- 
	    ^异或: 0000 0101  
		     & 0000 0001   &“位与”(相当于位的乘法) 
		     ----------------------------------------------------------
		    		   1 心得:x & 1  就是 x 的最低位的

异:不同 或:加
Output: 2
算法
对两个数,按位异或操作,统计有多少个 1 即可。
快速提升

  1. 什么是异或操作? 异或操作的神奇之处? 不同就为 1
  2. 什么是右移操作?
    解决方案 某力扣大佬提供的方案:
int hammingDistance1(int x, int y) 
{ 
	int diff = x ^ y; 
	int count = 0;
	while (diff) 
	{ 
		if (diff & 1) 
		{ 
			count++;
		}
		diff >>= 1; 
	}
	return count; 
}

该方案存在一个 BUG 当两个数一正一负时,会导致死循环!
改进的方案:

int hammingDistance2(int x, int y) 
{
	int diff = x ^ y; 
	int count = 0; 
	for (int i = 0; i < 32; i++) 
	{ 
		if (diff & 1) 
		{ 
			count++;
		}
		diff >>= 1; 
		if (diff == 0) 
		{ 
			break; 
		} 
	}
	return count; 
}

大厂笔试题 2(难度系数 2)

题目描述 给定一个十进制整数,输出它在二进制下的逆转结果(逆向排列)
实例:
Input: 43261596 (00000010100101000001111010011100)
Output: 964176192 (00111001011110000010100101000000)
算法
从右向左,拼接每一位。 使用左移,以空出最后一位,用来拼接下一个数字。
快速提升
解决方案:

int reverseBits(int number)
{ 
	int ret = 0; 
	for (int i = 0; i < 32; ++i) 
	{ 
		// 当前结果左移一位,以空出最右边的位置,以准备拼接 ret <<= 1;
		// 在最右边的位置,拼接“当前数据”的最低位 
		ret += number & 1; // number & 1 就是 number 的最低位 
		// 被处理的数据,再右位,以便下次循环时,处理它的最低位 
		number >>= 1; 
	}
	return ret; 
}

2.位运算在开发中的应用

读取某个指定的管脚的状态 设置某个指定的管脚的点位
读取某个指定的管脚的状态 设置某个指定的管脚的点位
实例 1:
某 32 位寄存器的地址是 0x7800 读取这个寄存器的第 9 位(最低位称为第 0 位)

int *p = (int*)0x7800; 
*p & (1<<9);

实例 2: 某 16 位寄存器的地址是 0x8600
把寄存器的第 14 位到第 11 位,设置为 1001(最低位称为第 0 位)

short *p = (short*)0x8600; 
*p = (*p & ~(15 << 11)) |9<<111; 

C 和 C++的主导领域
嵌入式、物联网。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值