J'ai 3 variables booléennes distinctes, bit1
, bit2
& bit3
et j'ai besoin de calculer l'équivalent entier décimal en JavaScript?
+true //=> 1
+false //=> 0
+!true //=> 0
+!false //=> 1
L'opérateur ternaire est une solution rapide en ligne:
var intVal = bit1 ? 1 : 0;
Si vous n'êtes pas familier avec l'opérateur ternaire, cela prend la forme
<boolean> ? <result if true> : <result if false>
De Sime Vidas dans les commentaires,
var intVal = +bit1;
fonctionne aussi bien et est plus rapide.
Si ce que vous demandez est de savoir comment obtenir la valeur entière 3 bits basée sur bit1 (MSB), bit2 et bit3 (LSB), vous pouvez simplement faire ce qui suit:
var intval = bit1 << 2 | bit2 << 1 | bit3;
Les déplacements à gauche (<<
) convertira automatiquement les booléens en leurs valeurs int correspondantes.
Démo en direct: http://jsfiddle.net/DkYqQ/
Number(true) // => 1
Number(false) // => 0
Utilisez ~~:
bit1 = ~~bit1; // bit1 = true will return 1 or bit1 = false rtuen 0
bit2 = ~~bit2;
bit3 = ~~bit3;
sum = bit1 + bit2 + bit3;
function boolToInt(bool){ return bool ? 1 : 0 }
function boolToInt(bool){ return bool | 0 }
function boolToInt(bool){ return bool & 1 }
function boolToInt(bool){ return ~~bool }
function boolToInt(bool){ return +bool }
choisir!
Vous avez la possibilité d'utiliser l'opérateur ternaire, il ressemblera à ceci:
var i = result ? 1 : 0;
Eh bien, cela pourrait être deux choses. Voulez-vous l'équivalent décimal au niveau du bit, comme si vous aviez écrasé bit1, bit2 et bit3 ensemble dans des bits significatifs adjacents? Ou voulez-vous le poids du hamming, où vous comptez combien de bits sont définis?
Si vous voulez l'équivalent au niveau du bit, vous voulez essentiellement utiliser une combinaison de décalage de bit et de sommation OR, ce qui est assez courant. En pseudocode:
var intResult = 0;
for each bit in {bit1, bit2, bit3}
{
int bitVal = 0;
if(bit) bitVal = 1;
intResult = (intResult << 1) | bitVal;
}
Si vous voulez le poids de hamming, augmentez simplement le résultat pour chaque bit défini:
var intResult = 0;
for each bit in {bit1, bit2, bit3}
if(bit) intResult++;
Si votre langue autorise l'utilisation de booléens comme valeurs entières (true = 1, false = 0), cela devient plus facile:
//bit-concatenation
var intResult = 0;
for each bit in {bit1, bit2, bit3}
intResult = (intResult << 1) | bit;
//hamming weight
var intResult = 0;
for each bit in {bit1, bit2, bit3}
intResult += bit;
function boolsToInt(){
var s = "";
for(var i in arguments)s+=arguments[i]?1:0;
return parseInt(s,2);
}
l'entrée peut être représentée comme bool ou int:
console.log(boolsToInt(true,false,true,true));
console.log(boolsToInt(1,0,1,1));