使用二进制序列追踪空箱状态的GAS编程算法问询
位掩码(Bitmask)追踪空箱状态的实现方案
你提到的用二进制整数记录多个二值状态的方法,标准名称是位掩码(Bitmask),这是编程中常用的状态压缩技巧,适合追踪多个开关状态的场景。
以下是针对你需求的具体实现算法(以14个箱子为例,箱子编号从1到14):
一、识别哪些箱子为空
假设控制值为controlValue,对于第k个箱子(1≤k≤14),通过按位与操作判断状态:
- 计算对应位的掩码:
mask = 1 << (k - 1)(将1左移k-1位,得到该箱子的二进制位标记) - 若
controlValue & mask !== 0,说明该位为1,对应箱子为空; - 若结果为0,说明该位为0,对应箱子非空。
示例(对应你3个箱子的设定):
- 控制值为5(二进制101),判断箱子1:
5 & 1 = 1 ≠ 0→ 箱子1为空;判断箱子2:5 & 2 = 0→ 箱子2非空;判断箱子3:5 & 4 = 4 ≠ 0→ 箱子3为空,和你描述的“箱子1和3为空”一致。
二、更新控制值(箱子填满或清空)
1. 箱子k被填满(从空变非空)
将对应位从1改为0,使用按位与取反操作:
controlValue = controlValue & ~(1 << (k - 1));
示例:控制值为3(箱子1和2为空),填满箱子1后,3 & ~1 = 2,对应控制值2(仅箱子2为空)。
2. 箱子k被清空(从非空变空)
将对应位从0改为1,使用按位或操作:
controlValue = controlValue | (1 << (k - 1));
示例:控制值为2(仅箱子2为空),清空箱子1后,2 | 1 = 3,对应控制值3(箱子1和2为空)。
3. 特殊设定适配(如你示例中的反向映射)
如果你坚持示例里“所有箱子为空对应0、无空箱对应7”的反向设定(即1代表非空,0代表空),只需调整逻辑:
- 判断空箱:
controlValue & mask === 0 - 填满箱子:
controlValue = controlValue | mask(将位设为1,标记非空) - 清空箱子:
controlValue = controlValue & ~mask(将位设为0,标记为空) - 所有箱子为空:直接设
controlValue = 0 - 无空箱:设
controlValue = (1 << 14) - 1(14个1的二进制数)
只要保持位含义与逻辑操作一致,核心都是位掩码的应用。
内容的提问来源于stack exchange,提问作者mortpiedra
相关产品推荐
相关产品推荐

