位操作与位标记
说明
这一页说明整数变量上的位操作写法。
这组命令不是普通加减乘除,而是把一个整数当成一组二进制开关来处理。
资料里这一组通常用于 0~31 位的状态控制。第二个参数表示第几位。
需要用一个变量保存多个开关状态、做掩码控制、减少变量占用时,可直接参考这一页。
适合什么场景
位操作适合处理这类需求:
- 一个整数里保存多个开关状态
- 某一位单独开关,不影响其它位
- 检查某一位是否已经开启
- 做批量掩码开关或状态组合
如果只是记录次数、阶段值、积分、奖励数值,继续使用 MOV、INC、DEC 这类普通变量操作即可。
常用命令
| 命令 | 作用 |
|---|---|
SetBit | 开启指定位置 |
UnsetBit | 关闭指定位置 |
FlipBit | 切换指定位置 |
IsBitSet | 检查指定位置是否开启 |
AND | 按位与运算 |
OR | 按位或运算 |
XOR | 按位异或运算 |
NOT | 全部取反 |
SetBit 开启某一位
SetBit 用于把指定位置设为开启。
#ACT
SetBit P1 22
这类写法表示把 P1 的第 22 位设为开启状态。
UnsetBit 关闭某一位
UnsetBit 用于把指定位置设为关闭。
#ACT
UnsetBit P1 22
这类写法表示把 P1 的第 22 位恢复为关闭状态。
FlipBit 切换某一位
FlipBit 用于把指定位置在“开 / 关”之间切换。
#ACT
FlipBit P1 31
需要同一按钮反复切换状态时,可优先使用这条写法。
IsBitSet 检查某一位
IsBitSet 用于判断指定位置是否已经开启。
#IF
IsBitSet P1 22
#ACT
SENDMSG 5 第22位已经开启
#IF
!IsBitSet P1 22
#ACT
SetBit P1 22
第一类写法用于检查状态,第二类写法用于“未开启才开启”。
AND / OR / XOR / NOT
这一组命令用于直接做位运算。
资料中的原始说明也把它们和 CompVal 的 & 比较放在同一组里,适合批量控制多个开关位。
OR
OR 用于按位开启指定掩码。
#ACT
OR P1 5
这类写法会把 P1 对应掩码里的位设为开启。
XOR
XOR 用于按位切换掩码对应的位置。
#IF
COMPVAL <$STR(P1)> & 1
#ACT
XOR P1 1
这类写法适合“命中某个掩码后把这一位翻转”。
AND
AND 用于按位与运算,常见于保留某些位或清掉某些位。
NOT
NOT 用于把整个变量的位全部取反。
这两条命令相对更晦涩,入门阶段如果只是开关某一位,优先使用 SetBit、UnsetBit、FlipBit、IsBitSet。
和 COMPVAL 配合检查
COMPVAL 支持 & 与运算比较,可用于检查某个掩码是否命中。
#IF
COMPVAL <$STR(P1)> & 4
#ACT
SENDMSG 5 第3位二进制开关为1
#ELSEACT
SENDMSG 5 第3位二进制开关为0
这类写法适合在不直接使用 IsBitSet 时,用掩码方式检查当前状态。
常见场景
未开启才开启
#IF
!IsBitSet P1 22
#ACT
SetBit P1 22
SENDMSG 5 第22位现在处于开启状态
这类写法适合“首次开启后不重复设置”的场景。
已开启才关闭
#IF
IsBitSet P1 22
#ACT
UnsetBit P1 22
SENDMSG 5 第22位现在处于关闭状态
切换某个开关状态
#ACT
FlipBit P1 31
一个整数保存多个状态
当多个状态只需要开 / 关两种结果时,可把它们集中存到同一个整数变量里,用不同位分别表示。
这种做法能减少变量数量,但可读性会下降,因此命名和注释要更清楚。
使用建议
- 只需要开关某一位时,优先使用
SetBit、UnsetBit、FlipBit、IsBitSet。 - 需要批量做掩码运算时,再考虑
AND、OR、XOR、NOT。 - 第二个参数表示位位置时,应先确认资料要求的位范围,当前常见写法按
0~31位理解。 - 位操作适合保存“开 / 关”状态,不适合拿来替代普通次数或数值计算。
- 和
COMPVAL &混用时,要先确认当前掩码值代表的是哪几位。
- 蓝海软件工具集 — 正则批量改配置,参数调整事半功倍
