【发布时间】:2012-09-03 17:23:53
【问题描述】:
我有 3 个独立的布尔变量 bit1、bit2 和 bit3,我需要在 JavaScript 中计算等效的十进制整数?
【问题讨论】:
-
您是否希望将每个转换为数字或组合转换为相当于 3 位的集合,即 bit3 表示 4?
标签: javascript boolean-expression
我有 3 个独立的布尔变量 bit1、bit2 和 bit3,我需要在 JavaScript 中计算等效的十进制整数?
【问题讨论】:
标签: javascript boolean-expression
+true //=> 1
+false //=> 0
+!true //=> 0
+!false //=> 1
【讨论】:
undefined 不是布尔值。
三元运算符是一种快速的单行解决方案:
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。
typeof true,参考Boolean)。那么这将如何解决问题呢?
+ 一元运算符:var intVal = +bit1;。这里不需要三元。
a = 5 > 44; alert(a+456.5); 之类的操作,您就会看到456.5。将44改为4,你会看到457.5。
Number(true) // => 1
Number(false) // => 0
【讨论】:
如果您要问的是如何根据 bit1 (MSB)、bit2 和 bit3 (LSB) 获取 3 位整数值,您可以执行以下操作:
var intval = bit1 << 2 | bit2 << 1 | bit3;
左移 (<<) 会自动将布尔值转换为其对应的 int 值。
【讨论】:
>> 运算符 ;)
bit3 被移动 2,bit2 被移动 1,bit1 不被移动......
bit1 是 MSB。它可以去任何一种方式。
使用~~:
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 }
选择!
【讨论】:
if (bool == true) { return 1 } else { return 0 }2,3,4. 在按位运算之前自动将布尔值转换为整数2. b> 按位或:true | 0 => 1; false | 0 => 0 3. 按位和:true &1 => 1; false & 1 => 0 4. 按位非,双反转:~true => -2; ~ -2 => 1; ~false => -1; ~ -1 => 0; 5. 模拟null + true,null + false,其中自动将布尔值引向整数,将空值引向0;如果按原样使用函数并且 bool === 未定义函数 1-4 返回 0;函数 5 返回 NaN;
你可以选择使用三元运算符,它看起来像这样:
var i = result ? 1 : 0;
【讨论】:
int 代替 var,虽然您可以省略空格,但您不应该这样做,它不符合不同的方法。
嗯,这可能是两件事。您是否想要按位十进制等效,就好像您在相邻的有效位中将 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;
【讨论】:
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));
【讨论】: