如何检测位掩码整数中特定位状态并转换为布尔数组(JS/Python/LUA实现)
如何检测位掩码整数中特定位状态并转换为布尔数组(JS/Python/LUA实现)
你说的思路完全没问题,位掩码就是靠2的幂次来区分各个布尔状态的,下面我给你整理JS、Python、Lua里的具体实现方法,都是最简单直接的通用方案:
一、检测特定位是否开启
核心逻辑用**按位与(&)**操作:把目标整数和对应位的掩码(2的幂次)做按位与,如果结果非零,说明该位是开启的(true),否则是关闭的(false)。注意别写成x &= mask,那是赋值操作,我们需要的是比较结果。
JavaScript实现
// 检测num中是否包含mask对应的位 function hasBit(num, mask) { return (num & mask) !== 0; } // 示例: console.log(hasBit(9, 1)); // 9是1+8,包含1 → true console.log(hasBit(9, 4)); // 9不包含4 → false console.log(hasBit(7, 2)); // 7是1+2+4,包含2 → true
Python实现
# 检测num中是否包含mask对应的位 def has_bit(num, mask): return (num & mask) != 0 # 示例: print(has_bit(9, 1)) # True print(has_bit(9, 4)) # False print(has_bit(7, 2)) # True
Lua实现
-- 检测num中是否包含mask对应的位 function hasBit(num, mask) return (num & mask) ~= 0 end -- 示例: print(hasBit(9, 1)) -- true print(hasBit(9, 4)) -- false print(hasBit(7, 2)) -- true
二、转换为布尔数组
如果需要把整数转换成[true, false, ...]这样的布尔数组(数组索引对应位的位置,索引0对应20=1,索引1对应21=2,以此类推),可以循环遍历每一位,用上面的检测方法生成数组。
JavaScript实现
// 将num转换为包含bitCount位的布尔数组 function toBitArray(num, bitCount) { const bitArray = []; for (let i = 0; i < bitCount; i++) { // 2**i 就是第i位的掩码(2的i次方) bitArray.push(hasBit(num, 2 ** i)); } return bitArray; } // 示例: console.log(toBitArray(9, 4)); // [true, false, false, true](对应1、8开启) console.log(toBitArray(7, 4)); // [true, true, true, false](对应1、2、4开启)
Python实现
# 将num转换为包含bit_count位的布尔数组 def to_bit_array(num, bit_count): # 1 << i 等价于2**i,位运算更高效 return [(num & (1 << i)) != 0 for i in range(bit_count)] # 示例: print(to_bit_array(9, 4)) # [True, False, False, True] print(to_bit_array(7, 4)) # [True, True, True, False]
Lua实现
-- 将num转换为包含bitCount位的布尔数组 function toBitArray(num, bitCount) local bitArray = {} for i = 0, bitCount - 1 do table.insert(bitArray, hasBit(num, 2^i)) end return bitArray end -- 示例: local arr1 = toBitArray(9, 4) for _, val in ipairs(arr1) do print(val) end -- 输出true、false、false、true local arr2 = toBitArray(7, 4) for _, val in ipairs(arr2) do print(val) end -- 输出true、true、true、false
小技巧
为了代码可读性更好,建议把每个位的掩码定义成常量,比如:
// JS示例 const FLAG_FIRST = 1; // 第0位 const FLAG_SECOND = 2; // 第1位 const FLAG_THIRD = 4; // 第2位 const FLAG_FOURTH = 8; // 第3位
这样使用的时候直接写hasBit(num, FLAG_THIRD),比写数字4更直观。
备注:内容来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

