我以前在Java(而不是Javascript)中使用了位掩码,但它已经有一段时间了,它让我出错了。
这是我想要使用的打字稿。 Theres 3角色,
enum Type {
FRUIT = 0x1,
VEGGIE = 0x2,
BOTH = FRUIT | VEGGIE
}
class Thing {
role:number;
constructor(role:Type){
this.role = role;
}
getRole(){
return this.role;
}
is(role:Type) {
return !!(this.role & role);
}
}
var whatever = new Thing(Type.FRUIT);
console.log('fruit', whatever.is(Type.FRUIT));
console.log('veggie', whatever.is(Type.VEGGIE));
console.log('both', whatever.is(Type.BOTH));
// fruit true
// veggie false
// both true
我从概念上看到为什么"两者都是"正在回归" true",但我的数学运算并不好。
当角色为FRUIT
或VEGGIE
时,其他角色均为假。当它设置为BOTH
时,一切都应该是真的。
尝试了一些移位和位操作的组合,但我无法获得该输出。如果我尝试将它们分开就可以了,但我想使用比特组合来构建。
答案 0 :(得分:5)
执行按位&
操作时,结果是在表达式中使用的两个值中都打开了这些位。
例如(摘自Pro TypeScript,第207页)
a 1011
&
b 1101
= 1001
第一列,两个值都是“开启(1)”,因此结果也会打开。第二列a
已关闭,因此结果为0
,第三列b
已关闭,因此再次为0
,最后一列均为开启,所以1
。
在你的情况下,它甚至更简单,因为你正在处理这么少的数字......
a 01 // FRUIT
&
b 11 // ALL
= 01 // FRUIT
结果是01
,如果你有十根手指,则为1
。
如果您使用双重!!
将1
转换为布尔值(我称之为slacker parsing),您将获得true
因为{{1}是真理。这并没有回答你真正要问的问题,即“这有点标志匹配”。
这就是1
是正确代码的原因,因为您不会从值this.role & role === role
的“真实性”中得到错误。
答案 1 :(得分:3)
return !!(this.role & role);
您的版本的格式为isAny
,但您希望它的格式为isAll
:
return (this.role & role) === role;