(1)给定一个整型数a,设置a的bit3,保证其他位不变。
a |= (1<<3)
(2)给定一个整形数a,设置a的bit3~bit7,保持其他位不变
a |= (0x1f<<3)
(3)给定一个整型数a,清除a的bit15,保证其他位不变。
a &= ~(1<<15)
(4)给定一个整形数a,清除a的bit15~bit23,保持其他位不变。
a &= ~(0x1ff<<15)
(5)给定一个整形数a,取出a的bit3~bit8。
a &= (0x3f<<3)
a >>= 3
(6)给一个寄存器的bit7~bit17赋值937
a &= ~(0x7ff<<7)
a |= (937<<7)
(7)给一个寄存器的bit7~bit17中的值加17
b = ((a & (0x7ff<<7))>>7 + 17)<<7
a &= ~(0x7ff<<7)
a |= b
(8)给一个寄存器的bit7~bit17赋值937,同时给bit21~bit25赋值17.
a &= ~((0x7ff<<7) | (0x1f<<21))
a |= ((937<<7) | (17<<21))
(9)用宏定义来完成位运算
截取变量的部分连续位:
#define GETBITS(x, n, m) ((x & (~(~(0U)<<(m-n+1)))<<(n-1)) >> (n-1))
分析:这个题目相当于我们(5)中做的事情,只不过要用宏来实现。
这个题目相当于是要把x的bit(n-1)到bit(m-1)取出来
复杂宏怎么分析:
((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))
第一步,先分清楚这个复杂宏分为几部分:2部分
(x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)
分析为什么要>>(n-1),相当于是我们(5)中的第二步
第二步,继续解析剩下的:又分为2部分
x & ~(~(0U)<<(m-n+1))<<(n-1)
分析为什么要&,相当于我们(5)中的第一步
第三步,继续分析剩下的:
~ (~(0U)<<(m-n+1)) << (n-1)
这个分析时要搞清楚第2坨到底应该先左边取反再右边<<还是先右边<<再左边取反。
解法:第一,查C语言优先级表;第二,自己实际写个代码测试。
说明这个式子应该是 ~(~(0U)<<(m-n+1)) << (n-1) ,这就又分为2部分了
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!