当前位置: 首页 > news >正文

内存的位运算

示例:提取和设置标志位

假设我们有一个32位的整数,其中不同的位代表不同的标志。例如:

  • 位0:是否开启日志(0表示关闭,1表示开启)

  • 位1:是否启用调试模式(0表示禁用,1表示启用)

  • 位2-31:保留或用于其他目的

提取标志位

如果我们想要检查是否启用了调试模式(位1),可以使用以下代码:

int flags = getStatusFlags(); // 假设这是一个获取状态标志的函数
bool isDebugModeEnabled = (flags & (1 << 1)) != 0;

这里的操作解释如下:

  1. (1 << 1):将1左移1位,得到 00000010(二进制)。

  2. flags & (1 << 1):对 flags00000010 进行按位与运算,结果中只有位1会被保留,其他位都会被清零。

  3. != 0:检查结果是否不为0,以确定是否启用了调试模式。

设置标志位

如果我们想要启用调试模式,可以使用以下代码:

int flags = getStatusFlags(); // 获取当前状态标志
flags |= (1 << 1); // 启用调试模式
setStatusFlags(flags); // 假设这是一个设置状态标志的函数

这里的操作解释如下:

  1. (1 << 1):将1左移1位,得到 00000010(二进制)。

  2. flags |= (1 << 1):对 flags00000010 进行按位或运算,结果中位1会被设置为1,其他位保持不变。

扩展:其他位运算的应用

1. 清除特定位

如果我们想要清除调试模式标志(位1),可以使用以下代码:

int flags = getStatusFlags(); // 获取当前状态标志
flags &= ~(1 << 1); // 清除调试模式标志
setStatusFlags(flags); // 设置状态标志

这里的操作解释如下:

  1. ~(1 << 1):对 00000010 进行按位取反,得到 11111111 11111111 11111111 11111101(二进制)。

  2. flags &= ~(1 << 1):对 flags 和取反后的结果进行按位与运算,结果中位1会被清零,其他位保持不变。

2. 切换特定位

如果我们想要切换调试模式标志(位1),可以使用以下代码:

int flags = getStatusFlags(); // 获取当前状态标志
flags ^= (1 << 1); // 切换调试模式标志
setStatusFlags(flags); // 设置状态标志

这里的操作解释如下:

  1. (1 << 1):将1左移1位,得到 00000010(二进制)。

  2. flags ^= (1 << 1):对 flags00000010 进行按位异或运算,结果中位1会被切换(如果原来是0则变为1,如果原来是1则变为0),其他位保持不变。

3. 检查多个标志

如果我们想要同时检查是否启用了日志和调试模式,可以使用以下代码:

int flags = getStatusFlags(); // 获取当前状态标志
bool isLogEnabled = (flags & (1 << 0)) != 0;
bool isDebugModeEnabled = (flags & (1 << 1)) != 0;

这里的操作解释如下:

  1. (flags & (1 << 0)) != 0:检查位0是否被设置,以确定是否启用了日志。

  2. (flags & (1 << 1)) != 0:检查位1是否被设置,以确定是否启用了调试模式。

通过这些示例,我们可以看到位运算在处理标志位时的高效性和灵活性。它们可以直接在二进制级别上操作数据,避免了额外的计算或转换步骤,非常适合在需要高效处理大量数据的场景中使用。

总之别被束缚:
像 int length = (0x11112222 >> 16) & 0FFFF; 它的结果就是length == 0x1111; 它的意思就是把高位16位二进制(高位的两个字节)移动到低16位,进行与运算。

相关文章:

  • Dify - Stable Diffusion
  • 未来设计新篇章!2025 年 UX/UI 设计趋势,技术与体验的全新结合!
  • 基于Jetson Nano与PyTorch的无人机实时目标跟踪系统搭建指南
  • 通过CIDR推出子网掩码和广播地址等
  • 【quantity】1 SI Prefixes 实现解析(prefix.rs)
  • 网络的搭建
  • BBS (cute): 1.0.2靶场渗透
  • [Linux]多线程(一)充分理解线程库
  • TCP数据报
  • 开发积分商城为商家带来的多重优势
  • 2.4线性方程组
  • CAN通信
  • Twin Builder 中的电池等效电路模型仿真
  • 如何在 Vue3 中更好地使用 Typescript
  • 【计算机网络 第8版】谢希仁编著 第四章网络层 地址类题型总结
  • Spring Boot操作MongoDB的完整示例大全
  • 《算法导论(第4版)》阅读笔记:p9-p9
  • OSCP - Proving Grounds - NoName
  • P1782 旅行商的背包 Solution
  • vue3在使用@import “./index.scss“报错
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓
  • 又一日军“慰安妇”制度受害者去世,大陆登记在册幸存者仅剩7人
  • 金融监管总局:正在修订并购贷款管理办法,将进一步释放并购贷款的潜力
  • 央行:5月15日起下调金融机构存款准备金率0.5个百分点
  • 浙江一文旅局长五一亲自带团,去年专门考取了导游证
  • 美伊谈判因“后勤原因”推迟,伊朗:视美国做法再定谈判日期