整数flags的每一位表示一种权限,掩码0x04对应需要检查的权限位。判断该位是否已经设置,正确表达式是()。
按位与只保留两边同时为1的位。flags与0x04相与后非0,说明该掩码对应的位已设置;其他权限位是否为1不影响判断。
选项分析
错误。加法会改变数值,不能稳定测试某一位。
错误。除法与位状态检测无直接关系。
错误。flags还有其他权限位时,即使目标位存在也不相等。
正确。按位与掩码可隔离并检查目标位。
本题为什么容易错
等于比较看的是整张权限表,掩码检查只看其中一格。题目只问某一位,就不能要求其他位都为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同时设置其他位也能正确判断。