【问题标题】:Boolean to integer conversion布尔到整数的转换
【发布时间】:2012-09-03 17:23:53
【问题描述】:

我有 3 个独立的布尔变量 bit1bit2bit3,我需要在 JavaScript 中计算等效的十进制整数?

【问题讨论】:

标签: javascript boolean-expression


【解决方案1】:
+true //=> 1
+false //=> 0

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

【讨论】:

【解决方案2】:

三元运算符是一种快速的单行解决方案:

var intVal = bit1 ? 1 : 0;

如果你不熟悉三元运算符,它的形式是

<boolean> ? <result if true> : <result if false>

来自 cmets 的 Sime Vidas,

var intVal = +bit1;

效果一样好,速度更快。

【讨论】:

  • var intVal = bit1 不就行了吗?布尔值毕竟是 1 或 0,因此会自动分配 1 或 0。
  • @Cupidvogel 赋值时不存在隐式转换,JavaScript 有单独的布尔类型(试试typeof true,参考Boolean)。那么这将如何解决问题呢?
  • 数字转换可以使用+ 一元运算符:var intVal = +bit1;。这里不需要三元。
  • 不知道,只需执行a = 5 &gt; 44; alert(a+456.5); 之类的操作,您就会看到456.5。将44改为4,你会看到457.5
  • @Cupidvogel,唯一的问题是如果您不对布尔值进行任何数字运算,它将不会转换为数字类型。
【解决方案3】:
Number(true) // => 1
Number(false) // => 0

【讨论】:

    【解决方案4】:

    如果您要问的是如何根据 bit1 (MSB)、bit2 和 bit3 (LSB) 获取 3 位整数值,您可以执行以下操作:

    var intval = bit1 << 2 | bit2 << 1 | bit3;
    

    左移 (&lt;&lt;) 会自动将布尔值转换为其对应的 int 值。

    现场演示: http://jsfiddle.net/DkYqQ/

    【讨论】:

    • 终于用到了 shift &gt;&gt; 运算符 ;)
    • 呃,我希望 bit3 被移动 2,bit2 被移动 1,bit1 不被移动......
    • Lucero,我在回答中提到我假设 bit1 是 MSB。它可以去任何一种方式。
    【解决方案5】:

    使用~~:

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

    【讨论】:

      【解决方案6】:
      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 }
      

      选择!

      【讨论】:

      • 你能解释一下你在这里做了什么吗?
      • 1. 模拟:if (bool == true) { return 1 } else { return 0 }2,3,4. 在按位运算之前自动将布尔值转换为整数2. b> 按位或:true | 0 => 1; false | 0 => 0 3. 按位和:true &amp;1 => 1; false &amp; 1 => 0 4. 按位非,双反转:~true => -2; ~ -2 => 1; ~false => -1; ~ -1 => 0; 5. 模拟null + truenull + false,其中自动将布尔值引向整数,将空值引向0;如果按原样使用函数并且 bool === 未定义函数 1-4 返回 0;函数 5 返回 NaN;
      • function boolToInt(bool){ return +bool } // 如果 bool = undefined
      • 上面的评论 - "...bool === 未定义的函数 1-4 返回 0;函数 5 返回 NaN"
      【解决方案7】:

      你可以选择使用三元运算符,它看起来像这样:

      var i = result ? 1 : 0;
      

      【讨论】:

      • 也可以使用,int myInt = (bit1)?1:0 ;
      • 不,您不能使用 int 代替 var,虽然您可以省略空格,但您不应该这样做,它不符合不同的方法。
      【解决方案8】:

      嗯,这可能是两件事。您是否想要按位十进制等效,就好像您在相邻的有效位中将 bit1、bit2 和 bit3 压缩在一起一样?或者你想要汉明权重,你在哪里计算设置了多少位?

      如果您想要按位等效,基本上您想要使用位移位和 OR-summing 的组合,这很常见。在伪代码中:

      var intResult = 0;
      for each bit in {bit1, bit2, bit3}
      {
         int bitVal = 0;
         if(bit) bitVal = 1;
         intResult = (intResult << 1) | bitVal;
      }
      

      如果您想要汉明权重,则只需为设置的每个位增加结果:

      var intResult = 0;
      for each bit in {bit1, bit2, bit3}
         if(bit) intResult++;
      

      如果您的语言允许将布尔值用作整数值(真 = 1,假 = 0),这些会变得更容易:

      //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;
      

      【讨论】:

        【解决方案9】:
        function boolsToInt(){
          var s = "";
          for(var i in arguments)s+=arguments[i]?1:0;
          return parseInt(s,2);
        }
        

        输入可以表示为 bool 或 int:

        console.log(boolsToInt(true,false,true,true));
        console.log(boolsToInt(1,0,1,1));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-18
          • 2016-04-14
          • 2013-02-09
          • 2012-06-16
          • 1970-01-01
          • 2013-12-03
          • 2014-09-03
          相关资源
          最近更新 更多