朱有鹏:位运算实战演练
约定: 题目中出现"设置"字符就是要把寄存器设置为1;出现”清除“ 就是把寄存器值设置为0
位操作口诀: 要置1用|;
要清零用&;
要取反用^;
~和 << >> 用来构建特定二进制数.
4.2.4.1 给定一个整型a, 设置a的bit3,保证其他位不变。
答: a = a | (1<<3) 或 a |= (1<<3)
4.2.4.2 给定一个整型a, 设置a的 bit3 ~ bit7 (3~7位为1),保证其他位不变。
答: a = a | (0b11111<<3)
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { unsigned int a; a = 0; printf ( "a = 0x%x\n" , a); a |= (0b11111<<3); printf ( "a = 0x%x\n" , a); } |
结果:
4.2.4.3 给定一个整型数a, 清除a的 bit15,保持其他位不变。
答: a = a & (~(1<<15)); 或者 a &= (~(1<<15))
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { unsigned int a; a = 0xFFFFFFFF; printf ( "a = 0x%x\n" , a); a &= (~(1<<15)); printf ( "a = 0x%x\n" , a); } |
结果:
4.2.4.4 给定一个整型数a,清除a的 bit15 ~ bit23,其他位保持不变
答: a = a & (~(0x1ff<<15)); 或者 a &= (~(0x1ff<<15))
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { unsigned int a; a = 0xFFFFFFFF; printf ( "a = 0x%x\n" , a); a &= (~(0x1ff<<15)); printf ( "a = 0x%x\n" , a); } |
结果:
4.2.4.5 给定一个整型数a,取出a的 bit3 ~ bit8 的值。
分析思路:
第一步:现将这个数 bit3 ~ bit8 不变,其余位全部清零;
第二步:将其右移 3 位得到结果。
第三步:想明白上面的两部算法,再将其转换为C语言实现即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main( void ) { unsigned int a = 0xc30288f8; printf ( "a = 0x%x\n" , a); // 输出a定义原始值 a &= (0x3f<<3); printf ( "a = 0x%x\n" , a); // 位与后的值 a >>= 3; printf ( "a = %u\n" , a); // 输出十进制 } |
结果:
4.2.4.6 用C语言给一个寄存器的 bit7 ~ bit17 赋值 937(其余位不受影响)
明白关键点:
第一:不能影响其他位;
第二:你并不知道原来 bit7 ~ bit17 值是什么;
思路:
第一步:先将 bit7 ~ bit17 全部清零,当然不能影响其他位;
第二步:再将937写入 bit7 ~ bit17 ,当然不能影响其他位。
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ) { unsigned int a = 0xc30288f8; printf ( "a = 0x%x\n" , a); a &= ~(0x7ff<<7); a |= (937<<7); printf ( "a = 0x%x\n" , a); } |
结果:
4.2.4.7 用C语言给一个寄存器的 bit7 ~ bit17 值加17(其余位不受影响)
明白关键点: 不知道原来的值是多少
思路:
第一步:先读出原来 bit7 ~ bit17 的值;
第二步:给这个值加17;
第三步:将 a 的 bit7~bit17 清零;
第四步:将第二步算出来的值写入 bit7 ~ bit17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> int main( void ) { unsigned int a = 0xc30288f8; unsigned int tmp = 0; printf ( "a = 0x%x\n" , a); tmp = a & (0x3ff<<7); //取出 7~17bit 的值 tmp >>= 7; // 将值移动到 最右边 0 位,获取到值,方便后面加法计算 tmp += 17; a &= ~(0x3ff<<7); a |= tmp<<7; printf ( "a = 0x%x\n" , a); } |
结果:
4.2.4.8 用C语言给一个寄存器的 bit7~bit17 赋值 937,同时给 bit21 ~ bit25 赋值 17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> int main( void ) { unsigned int a = 0xc30288f8; printf ( "原始值:a = 0x%x\n" , a); // 方式一:写法比较繁琐。 a &= ~(0x3ff<<7); a |= (937<<7); a &= ~(0x1f<<21); a |= (17<<21); printf ( "方式一:a = 0x%x\n" , a); // 方式二: 将上面的 4 行操作,合并在 2 行, // 网上代码大多数用此写法,推荐使用。 // 效果和"方式一"一样 a &= ~((0x3ff<<7) | (0x1f<<21)); a |= ((937<<7) | (17<<21)); printf ( "方式二:a = 0x%x\n" , a); } |
结果:
来源:
朱有鹏-嵌入式软件工程师完全学习路线图专题\4.C语言高级专题精讲视频课程套餐\4.2.C语言位操作\
4.2.4.位运算实战演练1.mp4
4.2.5.位运算实战演练2.mp4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!