布尔到整数的转换
Posted
技术标签:
【中文标题】布尔到整数的转换【英文标题】:Boolean to integer conversion 【发布时间】:2012-09-03 17:23:53 【问题描述】:我有 3 个独立的布尔变量 bit1
、bit2
和 bit3
,我需要在 javascript 中计算等效的十进制整数?
【问题讨论】:
您是否希望将每个转换为数字或组合转换为相当于 3 位的集合,即 bit3 表示 4? Convert boolean result into number/integer的可能重复 可能重复:***.com/questions/7820683/… 【参考方案1】:+true //=> 1
+false //=> 0
+!true //=> 0
+!false //=> 1
【讨论】:
我喜欢简洁的答案,但如果您能简短解释一下,我将不胜感激 这里是示例和说明文档的链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… @Doug 感谢@parsonsbots 应该解释一半。剩下的就是:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 这是一个糟糕的解决方案。试试 +undefined @Jiraff537 -undefined
不是布尔值。【参考方案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 > 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;
左移 (<<
) 会自动将布尔值转换为其对应的 int 值。
现场演示: http://jsfiddle.net/DkYqQ/
【讨论】:
终于用到了 shift>>
运算符 ;)
呃,我希望 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 &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;
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));
【讨论】:
以上是关于布尔到整数的转换的主要内容,如果未能解决你的问题,请参考以下文章