程序员 · 高频练习

怎样判断flags变量的0x04权限位是否已经设置?

初级 单选题 第 1126 题 较难 程序员位运算位掩码按位与权限标志
题目

整数flags的每一位表示一种权限,掩码0x04对应需要检查的权限位。判断该位是否已经设置,正确表达式是()。

A flags + 0x04
B flags / 0x04
C flags == 0x04
D (flags & 0x04) != 0
题目类型:原创高频练习题 用途:用于帮助理解程序员相关考点和答案解析,不等同于官方真题。
正确答案
D
答案解析

按位与只保留两边同时为1的位。flags与0x04相与后非0,说明该掩码对应的位已设置;其他权限位是否为1不影响判断。

选项分析

A

错误。加法会改变数值,不能稳定测试某一位。

B

错误。除法与位状态检测无直接关系。

C

错误。flags还有其他权限位时,即使目标位存在也不相等。

D

正确。按位与掩码可隔离并检查目标位。

本题为什么容易错

等于比较看的是整张权限表,掩码检查只看其中一格。题目只问某一位,就不能要求其他位都为0。

先看结论

简短答案

怎样判断flags变量的0x04权限位是否已经设置,正确答案是 D((flags & 0x04) != 0)。按位与只保留两边同时为1的位。flags与0x04相与后非0,说明该掩码对应的位已设置;其他权限位是否为1不影响判断。

解析

易混淆概念对比表

概念本题判断区别要点记忆提示
flags + 0x04 本题干扰项 错误。加法会改变数值,不能稳定测试某一位。 看到该词不要急着选,先判断是否真正解决题干问题
flags / 0x04 本题干扰项 错误。除法与位状态检测无直接关系。 看到该词不要急着选,先判断是否真正解决题干问题
flags == 0x04 本题干扰项 错误。flags还有其他权限位时,即使目标位存在也不相等。 看到该词不要急着选,先判断是否真正解决题干问题
(flags & 0x04) != 0 本题正确答案 正确。按位与掩码可隔离并检查目标位。 看到题干核心场景时优先联想到它
本题易混淆选项怎么区分
  • flags + 0x04:错误。加法会改变数值,不能稳定测试某一位。
  • flags / 0x04:错误。除法与位状态检测无直接关系。
  • flags == 0x04:错误。flags还有其他权限位时,即使目标位存在也不相等。
复习

知识点详解

测试位使用(flags & mask) != 0;设置位使用flags | mask;清除位使用flags & ~mask;翻转位使用flags ^ mask。位掩码可在一个整数中紧凑保存多个布尔状态。

备考速记

AND拿手电只照一位,非零就说明那盏灯亮着。

权限标志在权限标志场景中的作用

若flags为0x0C,既包含0x08也包含0x04。flags==0x04为假,但(flags&0x04)!=0为真,后者才符合‘是否拥有该权限’。

拓展

同类题怎么考

  • 用位掩码检查、设置或清除权限位。
  • 判断整体相等与单个位测试的差异。
权限标志在程序员软考中的考法

先判断题目动作是查、开、关还是翻转,再选择AND、OR、AND NOT或XOR。

解题思路

0x04的二进制只有目标位是1。拿它和flags做AND,就像用模板只露出这一格;露出来非0即表示已设置,选D。

考点定位

flags==0x04要求整个变量只能有这一位,若同时拥有其他权限也会错误返回false;检查单个位应使用掩码。

易错提醒

  • 把逻辑与&&写成按位与&,或反过来。
  • 设置权限时使用异或,重复执行反而把权限关闭。
  • 清除位时忘记对掩码取反。

备考提示

  • 测试用AND,设置用OR,清除用AND反码,翻转用XOR。
  • 把0x04写成二进制00000100再观察每种运算。

你可能还想了解

  • 如何检查整数的某一位?
  • flags等于mask为什么不可靠?
  • 位掩码设置和清除怎么写?

本文小结

使用(flags & 0x04) != 0可只检查目标权限位,即使flags同时设置其他位也能正确判断。