脚本基础

位操作与位标记

说明 Blue 引擎里把一个整数拆成多个开关位使用的常见写法,包括 SetBit、UnsetBit、FlipBit、IsBitSet、AND、OR、XOR、NOT。

说明

这一页说明整数变量上的位操作写法。

这组命令不是普通加减乘除,而是把一个整数当成一组二进制开关来处理。

资料里这一组通常用于 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 & 混用时,要先确认当前掩码值代表的是哪几位。

相关阅读