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

[OS] 区分按位与()和逻辑与()

if(vma->flags & MAP_SHARED) {
    filewrite(vma->f, addr, len);
  }

在这里,if(vma->flags & MAP_SHARED) 使用的是按位与(&)操作,而不是逻辑与(&&),原因在于:

1. 区分按位与(&)和逻辑与(&&

  • 按位与(&

    • 用于位操作,检查特定位是否被设置。
    • 在这种情况下,vma->flags 是一个包含多个标志的整数,通过 & 可以检查特定位(如 MAP_SHARED)是否为 1
    • 如果 MAP_SHARED 位被设置,条件为 true
  • 逻辑与(&&

    • 用于逻辑表达式的短路求值。
    • 检查两个完整的布尔表达式是否都为 true

2. 为什么这里用 &

vma->flags 是一个整数,表示多个标志的组合。我们只关心其中的 MAP_SHARED 位是否被设置,而不是整个 flags 的值是否等于某个布尔值。

示例:

假设 vma->flags 值为二进制 0101,它的含义可能是:

  • 第 0 位:MAP_READ
  • 第 1 位:MAP_WRITE
  • 第 2 位:MAP_SHARED

如果我们想检查 MAP_SHARED 是否被设置:

  • 按位与(&vma->flags & MAP_SHARED
    • 仅检查第 2 位是否为 1,而不关心其他位的值。
  • 逻辑与(&&vma->flags && MAP_SHARED
    • 这会首先将 vma->flagsMAP_SHARED 分别作为布尔值进行判断,然后再检查它们是否都为 true。这是不符合意图的。

3. 使用逻辑与(&&)的错误后果

如果改成 if(vma->flags && MAP_SHARED),逻辑会变成:

  1. vma->flags 是否非零(即存在任意标志)。
  2. MAP_SHARED 是否非零(常量通常非零)。

两者都为 true 时,条件才成立。这种逻辑显然不符合我们希望仅检查 MAP_SHARED 位是否被设置的意图。


4. 为什么单独用 & 就足够了?

vma->flags & MAP_SHARED 的结果:

  • 如果 MAP_SHARED 位被设置,结果为非零(即 true)。
  • 如果 MAP_SHARED 位未被设置,结果为零(即 false)。

这与 if 的语义完全一致,无需额外转换。


总结

使用 & 是因为我们只需要检查 MAP_SHARED 位是否被设置,而不是检查整个表达式是否为布尔意义上的 true。逻辑与(&&)不适用于位操作,且会导致错误的逻辑行为。


http://www.kler.cn/a/390488.html

相关文章:

  • MySql结合element-plus pagination的分页查询
  • L10.【LeetCode笔记】回文链表
  • 使用pytest+openpyxl做接口自动化遇到的问题
  • 物理设备命名规则(Linux网络服务器 15)
  • vxe-table 3.10+ 进阶高级用法(一),根据业务需求自定义实现筛选功能
  • Java之泛型--对象指定多个泛型类型(有示例)
  • C# 如何将winform只生成一个绿色文件?
  • 02-1_MVCC版本链清理
  • 手写一些方法
  • Mac保护电池健康,延长电池使用寿命的好方法
  • 十六:Spring Boot依赖 (1)-- spring-boot-starter 依赖详解
  • 捕获抖音截图:如何用Puppeteer保存页面状态
  • linux 通过apt安装软件包时出现依赖包版本不对的问题解决
  • 我谈维纳(Wiener)复原滤波器
  • ChatGPT 通过三种方式帮助我进行学术写作
  • 编程之路,从0开始:练习篇
  • Maven最佳实践
  • 嵌入式ARM平台Linux网络实时性能优化
  • Spring Plugin与策略模式:打造动态可扩展的应用
  • 大数据技术在智慧医疗中的应用
  • 期刊论文查重率多少,才会不被认定为学术不端?
  • CSS的定位(文档流,相对定位,绝对定位,固定定位)
  • Tomcat(4) Tomcat支持哪些版本的Java?
  • PCB板材和适用场合
  • 常见的排序算法及分类对比
  • ReactPress:构建高效、灵活、可扩展的开源发布平台