Javascript位掩码

时间:2015-09-04 21:35:33

标签: javascript typescript bit-manipulation bitmask

我以前在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",但我的数学运算并不好。

当角色为FRUITVEGGIE时,其他角色均为假。当它设置为BOTH时,一切都应该是真的。

尝试了一些移位和位操作的组合,但我无法获得该输出。如果我尝试将它们分开就可以了,但我想使用比特组合来构建。

2 个答案:

答案 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;