c/c++学习笔记(3)
这次的章节主要是对于按位运算符的掌握,如:~、&、|、>>、<<,看到这几个运算符,让我想起了以前突然有一次在网上看到一个算法(C#)写的,里面就有很多这样的按位运算符,当时我就懵了,于是便到网上找资料,当时用具体的按位运算符去搜索,没找到什么资料,后来就发了博文,记录了自己一些理解,现在回想起来,终于把这几个问题搞明白了,呵呵。
由于刚刚掌握没多久,怕自己隔段时间就会生疏,于是拿一道练习题来做解析,以后自己再来看便能更好的熟悉起来。
例题:将x中从第p位开始的n个(二进制)位设置为y中最右边的n位的值。
实现:

1 unsigned setbits(unsigned x, int p, int n, unsigned y) 2 { 3 return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n)); 4 }
解析:
1、~0 << (p + 1)
~0将0的二进制位进行反转,也就是无限个1,然后向左移动p+1位,如图:
2、~(~0 << (p + 1 - n))
将0反转,然后向左移动p+1-n位,然后反转,如图:
3、(~0 << (p + 1) | (~(~0 << (p + 1 - n)))
将1和2中的结果进行按|取值,结果如图:
4、x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))
将x的值跟前面3步的结果进行按|取值,结果会变成x从p开始的n个位的二进制值为0,其他值不变,如图:
5、 ~(~0 << n)
经过上述分析,这个表达式的值就显而易见了,结尾为n个1,其余位数为0,如图:
6、y & ~(~0 << n)
将y与第五步进行按&取值,其结果为保留y最右边n位真实值,其他位都为0,如图:
7、(y & ~(~0 << n)) << (p + 1 - n)
将第6步的结果向左移动p+1-n位,也就是在最右边添加p+1-n位0,如图:
8、(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n))
最后的表达式则是将左右两边最后的值,进行按|取值,得出最后的结果,如图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述