簡體   English   中英

JavaScript位掩碼

[英]Javascript bit masks

我以前在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

我從概念上了解了為什么“兩個”又返回“真實”,但是我的數學並不好。

當角色為FRUITVEGGIE ,其他角色為false。 設置為BOTH ,都應該為true。

嘗試了一些移位和位運算的組合,但我無法獲得該輸出。 如果我嘗試將它們分開,那很好,但是我想使用位組合來構建。

當執行按位&運算時,結果是表達式中使用的兩個值中的位均打開。

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

a 1011
&
b 1101
= 1001

在第一列中,兩個值都“已打開(1)”,因此結果也已打開。 第二列a被關閉,因此結果為0 ,第三列b被關閉,因此a再次為0 ,最后最后一列都為on,因此a 1

就您而言,它甚至更簡單,因為您處理的是這么小的數字...

a 01 // FRUIT
&
b 11 // ALL
= 01 // FRUIT

因此,結果為01 ,如果您有十根手指,則為1

如果您使用雙響!! 1轉換為布爾值(我稱之為slacker parsing ),您將得到true因為1true -y。 這不能回答您真正提出的問題,即“該位標志是否匹配”。

這就是為什么this.role & role === role是正確的代碼的原因,因為您不會從值1的“真實性”中得到一個錯誤。

 return !!(this.role & role); 

您的版本可以按isAny ,但是您希望它按isAll

return (this.role & role) === role;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM