如何理解JavaScript中(sum & operand) === operand的位与运算逻辑?
位运算判断包含逻辑原理解析
这个has函数的作用是判断sum的二进制表示中,是否覆盖了operand所有置为1的二进制位,通常用于标志位、权限位的判断场景。
核心规则铺垫
按位与(&)的运算规则非常简单:将两个数字转为二进制后逐位对比,只有两个数的对应二进制位都为1时,结果的对应位才为1,否则为0。
判断条件逻辑拆解
我们要理解(sum & operand) === operand的逻辑,只要抓住一个核心:如果要让按位与的结果等于operand,那么operand里所有值为1的二进制位,sum的对应位置必须也是1。
反过来想:如果operand有任意一个为1的位,sum对应的位置是0,那么按位与之后该位置的结果就是0,最终的运算结果一定小于operand,不可能和operand相等。
示例验证
就拿你给出的代码示例has(7, 4)来计算:
- 十进制7转二进制为
0111 - 十进制4转二进制为
0100 - 两者按位与的计算过程:
0111(十进制7) & 0100(十进制4) -------- 0100(十进制4)
运算结果正好等于operand的值4,所以返回true,说明7包含4对应的标志位。
再举一个反例,比如调用has(3,4):
- 十进制3转二进制为
0011 - 和4的二进制
0100按位与的结果是0000,不等于4,所以返回false,说明3不包含4对应的标志位。
如果operand是多个标志位的组合值,这个判断也可以用来验证sum是否同时拥有这些组合里的所有标志位。
常见使用场景
这种写法最常用在多标志位管理场景:我们会将每个独立的标志/权限定义为2的幂(1、2、4、8、16...,每个数对应唯一的一个二进制位),把多个标志相加得到总和sum,之后就能用这个方法快速判断是否包含某个指定标志。
内容的提问来源于stack exchange,提问作者Wenfang Du
相关产品推荐
相关产品推荐

