😄在进行嵌入式开发时,位运算的应用是必不可少的,而位运算不仅作用在嵌入式
开发中,在进行游戏开发时也非常重要,毕竟是直接对bit进行操作,效率要快很多。今
天就与我一起用一篇博客带你进一步了解位运算在嵌入式开发中的实例。🚀🚀🚀
搞懂 C 语言的凌波微步-位操作 :
- 快速掌握 C 语言的底层技能-位操作
- 快速掌握大厂笔试中的位操作
- 快速掌握企业开发中的位操作
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
- 什么是右移操作?
解决方案 某力扣大佬提供的方案:
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++的主导领域
嵌入式、物联网。