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

内存的位运算

示例:提取和设置标志位

假设我们有一个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位,进行与运算。

http://www.xdnf.cn/news/4293.html

相关文章:

  • 从设计到应用:大尺寸PCB打样的关键领域解析
  • CEF格式说明
  • 深入理解Python异步编程:从协程到高性能IO密集型应用
  • 基于【抖音弹幕抓取数据推送】——制作抖音消息分类查看界面
  • 消失的两个数字 --- 位运算
  • MySQL中的约束
  • 基于STM32、HAL库的SST26VF064B NOR FLASH存储器驱动应用程序设计
  • Python __new__ 一个特殊的静态方法
  • 理清缓存穿透、缓存击穿、缓存雪崩、缓存不一致的本质与解决方案
  • 依赖注入详解与案例(前端篇)
  • 基于ASP.NET+MySQL实现待办任务清单系统
  • 信奥赛CSP-J复赛集训(DP专题)(37):P4170 [CQOI2007] 涂色
  • [学习]RTKLib详解:rtkcmn.c与rtkpos.c
  • 学习Python的第二天之网络爬虫
  • cephadm部署ceph集群
  • php案列
  • QML ProgressBar控件详解
  • G919-GAS软件 JSON格式数据通讯协议-阵列数据解析
  • SQLark可以支持PostgreSQL了,有哪些新功能?
  • C++ Avl_Tree
  • 239. 滑动窗口最大值
  • yolo训练用的数据集的数据结构
  • RPA自动化:开启智能流程新时代
  • OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()
  • 面试常问系列(一)-神经网络参数初始化-之-softmax
  • java springboot解析出一个图片的多个二维码
  • 软考-软件设计师中级备考 13、刷题 数据结构
  • k8s node soft lockup (内核软死锁) 优化方案
  • python3使用:macOS上通过Homebrew安装pip库
  • linux 如何防止内存碎片化?