web-dev-qa-db-fra.com

Conversion booléenne en entier

J'ai 3 variables booléennes distinctes, bit1, bit2 & bit3 et j'ai besoin de calculer l'équivalent entier décimal en JavaScript?

43
user1661099
+true //=> 1
+false //=> 0

+!true //=> 0
+!false //=> 1
76
yckart

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.

29
Samuel

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/

13
Ethan Brown
Number(true) // => 1
Number(false) // => 0
11
Tim

Utilisez ~~:

bit1 = ~~bit1; // bit1 = true will return 1 or bit1 = false rtuen 0
bit2 = ~~bit2;
bit3 = ~~bit3;

sum = bit1 + bit2 + bit3;
6
Otman Bouchari
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!

3
MypKOT-1992

Vous avez la possibilité d'utiliser l'opérateur ternaire, il ressemblera à ceci:

var i = result ? 1 : 0;
1
C_sharp

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;
0
KeithS
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));
0
user669677