JavaScript位掩码

Phi*_*hix 1 javascript bit-manipulation bitmask typescript

我以前在Java(不是Javascript)中使用过位掩码,但是已经有一段时间了,这让我很烦。

这是我要使用的打字稿。有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
Run Code Online (Sandbox Code Playgroud)

我从概念上了解了为什么“两个”又返回“真实”,但是我的数学并不好。

当角色为FRUIT或时VEGGIE,其他角色为false。设置为时BOTH,所有设置都应为true。

尝试了一些移位和位运算的组合,但我无法获得该输出。如果我尝试将它们分开,那很好,但是我想使用位组合来构建。

Qwe*_*tiy 5

return !!(this.role & role);
Run Code Online (Sandbox Code Playgroud)

您的版本可以作为isAny,但您希望它可以作为isAll

return (this.role & role) === role;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案实际上可能包含正确的代码,但它确实需要一些解释。 (3认同)

Fen*_*ton 5

当您执行按位&运算时,结果是在表达式中使用的两个值中的位均打开。

例如(摘自Pro TypeScript,第207页)

a 1011
&
b 1101
= 1001
Run Code Online (Sandbox Code Playgroud)

在第一列中,两个值都“已打开(1)”,因此结果也已打开。第二列a关闭,因此结果是0,第三列b关闭,因此再次a 0,最后最后一列都打开,因此a 1

就您而言,它甚至更简单,因为您处理的是这么小的数字...

a 01 // FRUIT
&
b 11 // ALL
= 01 // FRUIT
Run Code Online (Sandbox Code Playgroud)

因此结果为01,或者1如果您有十根手指。

如果您使用double-bang !!转换1为布尔值(我将此称为slacker parsing),您将得到,true因为它1是true。这不能回答您真正提出的问题,即“该位标志是否匹配”。

这就是为什么this.role & role === role代码正确的原因,因为您不会因为value的“真实性”而犯错1