2017-12-20 17 views
1

ビットマスクを使用してブール値を格納する方法について読んだ後、ちょっと混乱します。私はブール値のセットを持っていて、その値の組み合わせごとにユニークな整数を生成したいと思います。bitmasksを使用してブール値をJavaScriptに格納する方法

function getInt(x, y, z) { 
    var value = a 
    if (x) value = value | b 
    else value = value^b 

    if (y) value = value | c 
    else value = value^c 

    if (z) value = value | d 
    else value = value^z 

    return value 
} 

すべて:私は「ない」場合に対処することになっていた場合、私はこの線に沿って、わからない、

var a = 1 << 1 
var b = 1 << 2 
var c = 1 << 3 
var d = 1 << 4 

var uniqueint1 = getInt(true, false, false) 
var uniqueint2 = getInt(true, true, false) 
var uniqueint3 = getInt(true, true, true) 
// ... 

function getInt(x, y, z) { 
    var value = a 
    if (x) value = value | b 
    if (y) value = value | c 
    if (z) value = value | d 
    return value 
} 

しかし、問題は次のとおりです。ここでは、これまでに現在のシステムがあります私が知っているのは、|&、および^がビットマスクに関連していて、ブール値がvar yes = value & bのビットマスクに含まれているかどうかを知っていますが、ビットマスクを生成して両方を処理する方法が混乱していますif(真)とif(偽)の場合です。もし私が^をどこかに使っていなければならないのか、それとも私が間違っているのか分かりません。お知らせ下さい。ありがとうございました!

+0

にあなたのコードを簡素化することができますか?それはちょうど否定された形の「はい」ではないでしょうか?私はまた、bitwise xor演算子を使って何をもたらすのだろうかと思います。 –

答えて

1

ノーオペレーション反転ビットをクリアするためには、ビットをセットする必要があります。

var v = 0xff;   // value 
 
var bit3 = 1<<3;   // the bit we want to clear 
 

 
// clear bit 3: 
 
v &= ~bit3;    // create a AND mask inverting bit 3 and AND with value 
 
console.log(v.toString(2)); 
 

 
v &= ~bit3;    // will not set the bit even when already cleared 
 
console.log(v.toString(2));

:あなたはあなたがこのようなビットをオフにクリアするとマスクではありません一緒に使用することができ、既存の価値:)にオンまたはオフビットを切り替えたいと仮定すると、

var v = 0xff; 
 
var bit3 = 1<<3; 
 

 
if (v & bit3) v ^= bit3; // NOT bit 3 if set 
 
console.log(v.toString(2)); 
 

 
// should not trigger: 
 
if (v & bit3) console.log("Whaa");
:それがある場合はもちろん、それをビットがセットされているかどうかを確認してからすることはできません

あなたが使用OR状態に関係なくなり、代わりにそれを設定するには:あなたが最初または一緒にビット、 はそのとしないために使用することができ、一度に使用すると、複数のビットをクリアする必要がある場合は

if (v & bit3) v ^= bit3; // NOT bit 3 if set 
else {v |= bit3};   // set it not set already 

ANDマスク:あなたがそう何かリクできた機能でそう

var v = 0xff; 
 
var bit1 = 1<<1; 
 
var bit3 = 1<<3; 
 

 
// create NOT mask: 
 
var mask = bit1 | bit3; 
 

 
// clear bits: 
 
v &= ~mask; 
 
console.log(v.toString(2));

E本:

var a = 0xff; 
 
var b = 1 << 2 
 
var c = 1 << 3 
 
var d = 1 << 4 
 

 
function getInt(x, y, z) { 
 
    var value = a; 
 
    value = x ? value | b : value & ~b; 
 
    value = y ? value | c : value & ~c; 
 
    value = z ? value | d : value & ~d; 
 
    return value 
 
} 
 

 
// turn off bit c/d (bit index 3 & 4): 
 
console.log(getInt(true,false,false).toString(2)); 
 

 
// turn on c, off b/d 
 
console.log(getInt(false,true,false).toString(2)); 
 

 
// with same value turn off all, then on c: 
 
a = getInt(false, false, false); 
 
console.log(getInt(false,true,false).toString(2));

+0

反転するのに '0xFF^bit3'を使用しないでください。 '〜bit3'を使用してください。これは8ビットだけでなく、すべての(JS 32の)ビットを反転します。 – Bergi

+0

@Bergi私はその1つを忘れてしまった。ありがとう(または私はC ..hmmを考えていた)。 0xff私は怠け者だった:) – K3N

0

1<<1=2ので、あなたはすでに、2に値を設定している冒頭でvar value=1を行うことによって。 value=0を設定して、else value = value^cを削除することをお勧めします。これは、すべてのゼロで開始するとその操作が変更されないためです。以下のようになりますあなたのコードは次のとおりです。これは4、代わりにuniqueint1ため6を出力

var a = 1 << 1 
var b = 1 << 2 
var c = 1 << 3 
var d = 1 << 4 

function getInt(x, y, z) { 
    var value = 0 
    if (x) value = value | b 
    if (y) value = value | c 
    if (z) value = value | d 
    return value 
} 

var uniqueint1 = getInt(true, false, false) 
var uniqueint2 = getInt(true, true, false) 
var uniqueint3 = getInt(true, true, true) 
uniqueint1 

3

私は私はあなたがすべてでそれを処理することになっていない「ない」場合

を扱うことになっていますかどうかわからないです。ビットマスクは、フラグが設定されている場合は値1を、そうでない場合は値0のビットを持つように動作します。値が0から始まる場合(整数0)、条件が満たされていれば何もする必要はありません。

あなたは、あなたが「ない」場合に何を意味するかについて、より具体的にすることができ

function getInt(x, y, z) { 
    return (0b10 // a 
      | (x << 2) // 0b00100 if x and 0b00000 else 
      | (y << 3) // 0b01000 if y and 0b00000 else 
      | (z << 4)); // 0b10000 if z and 0b00000 else 
} 
関連する問題