Преобразование логического значения в целое число

У меня есть 3 отдельные логические переменные, bit1, bit2 и bit3, и мне нужно вычислить эквивалент десятичного целого числа в JavaScript?


person user1661099    schedule 10.09.2012    source источник
comment
вы хотите преобразовать каждый в число или комбинацию в то, что составляет 3-битный набор, где, например, бит3 будет представлять 4?   -  person Matt Whipple    schedule 10.09.2012
comment
возможный дубликат преобразовать логический результат в число/целое число   -  person James Lawruk    schedule 27.08.2014
comment
Возможный дубликат: stackoverflow.com/questions/7820683 /   -  person cs95    schedule 19.02.2020


Ответы (8)


Тернарный оператор — это быстрое однострочное решение:

var intVal = bit1 ? 1 : 0;

Если вы не знакомы с тернарным оператором, он принимает вид

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

От Симе Видас в комментариях,

var intVal = +bit1;

работает так же хорошо и быстрее.

person Samuel    schedule 10.09.2012
comment
Не поможет ли просто var intVal = bit1? В конце концов, логическое значение — это либо 1, либо 0, поэтому оно автоматически присваивает 1 или 0. - person SexyBeast; 11.09.2012
comment
@Cupidvogel Во время присваивания не существует такой вещи, как неявное преобразование, а в JavaScript есть отдельный логический тип (попробуйте typeof true и обратитесь к Boolean). Итак, как это поможет? - person ; 11.09.2012
comment
Преобразование чисел можно выполнить с помощью унарного оператора +: var intVal = +bit1;. Тернар здесь не нужен. - person Šime Vidas; 11.09.2012
comment
Не знаю, просто сделайте что-нибудь вроде a = 5 > 44; alert(a+456.5);, вы увидите 456.5. Измените 44 на 4, вы увидите 457.5. - person SexyBeast; 11.09.2012
comment
@Cupidvogel, единственная проблема в том, что если вы не выполняете никаких числовых операций с логическим значением, оно не будет преобразовано в числовой тип. - person Samuel; 11.09.2012
comment
@Cupidvogel Это потому, что логические значения преобразуются в 0/1, если вы выполняете с ними арифметические действия. Это не означает, что они взаимозаменяемы в других контекстах (например, при выводе). - person ; 11.09.2012
comment
Если я не выполняю над ним числовые операции, то зачем мне искать его десятичное значение? - person SexyBeast; 11.09.2012
comment
@ŠimeVidas Спасибо, я добавил ваше решение - person Samuel; 11.09.2012
comment
@delnan, именно в этом проблема, я использовал var intVal = bit1, и это выдает случайные ошибки. каков формат типа истинного утверждения? - person user1661099; 11.09.2012
comment
Отображение @Cupidvogel в пользовательском интерфейсе. Если вы соедините бит 1 со строкой, он выведет true или false. Это только один пример - person Samuel; 11.09.2012
comment
@ user1661099 Какие ошибки? Что касается typeof true, это просто говорит вам, что тип true является логическим, что показывает, что логические значения отделены от чисел. - person ; 11.09.2012
comment
Ваш второй пример должен выглядеть как <boolean> ? <result if true> : <result if false>. У вас перепутаны операторы. - person Alex Vulaj; 11.08.2015
comment
Тернарный оператор идеально подходит для меня! Я передаю значение boolean функции, которая записывает значение в базу данных. Но БД — это MySQL, поэтому boolean нужно преобразовать в tinyint. Используя ваш ответ, я теперь могу сделать это максимально коротким и ненавязчивым, как это (обычное условие if вызывает ошибку): writeToDb($("#checkbox").prop("checked")?1:0); //call to function - person myfunkyside; 24.05.2016

Если вы спрашиваете, как получить 3-битное целочисленное значение на основе бит1 (MSB), бит2 и бит3 (LSB), вы можете просто сделать следующее:

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

Сдвиги влево (<<) автоматически преобразуют логические значения в соответствующие значения int.

Текущая демонстрация: http://jsfiddle.net/DkYqQ/

person Ethan Brown    schedule 10.09.2012
comment
наконец, использование оператора сдвига >> ;) - person Evandro Silva; 11.09.2012
comment
Э-э, я ожидаю, что bit3 будет смещено на 2, bit2 будет смещено на 1, а bit1 не будет сдвинуто... - person Lucero; 11.09.2012
comment
Лусеро, я упомянул в своем ответе, что предполагал, что bit1 является MSB. Это могло пойти в любом случае. - person Ethan Brown; 11.09.2012

Используйте ~~ :

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

sum = bit1 + bit2 + bit3;
person Otman Bouchari    schedule 10.02.2014

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 }

выберите!

person MypKOT-1992    schedule 26.02.2017
comment
Можешь объяснить, что ты здесь делал? - person M. Adeel Khalid; 26.02.2017
comment
1. аналог: if (bool == true) { return 1 } else { return 0 } 2,3,4. автоматически приводит логическое значение к целому перед побитовыми операциями 2. побитовое или: 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 === undefined functions 1-4 return 0; функция 5 возвращает NaN; - person MypKOT-1992; 26.02.2017
comment
function boolToInt(bool){ return +bool } // что, если bool = undefined - person Jiraff537; 16.10.2019
comment
комментарий выше - ...bool === неопределенные функции 1-4 возвращают 0; функция 5 возвращает NaN - person MypKOT-1992; 19.10.2019

У вас есть возможность использовать тернарный оператор. Это будет выглядеть примерно так:

var i = result ? 1 : 0;
person C_sharp    schedule 10.09.2012
comment
Также вы можете использовать int myInt = (bit1)?1:0 ; - person C_sharp; 11.09.2012
comment
Нет, вы не можете использовать int вместо var, и хотя вы можете опустить пробел, вы не должны этого делать, и это не считается другим подходом. - person ; 11.09.2012

Ну, это может быть две вещи. Вам нужен побитовый десятичный эквивалент, как если бы вы сжали бит 1, бит 2 и бит 3 вместе в соседних значащих битах? Или вам нужен вес Хэмминга, где вы считаете, сколько битов установлено?

Если вам нужен побитовый эквивалент, в основном вы хотите использовать комбинацию побитового сдвига и суммирования по ИЛИ, что довольно распространено. В псевдокоде:

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

Если ваш язык позволяет использовать логические значения как целочисленные значения (true = 1, false = 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;
person KeithS    schedule 10.09.2012

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));
person Community    schedule 26.04.2013

person    schedule
comment
Мне нравятся краткие ответы, но я был бы признателен, если бы вы могли кратко объяснить это. - person Doug; 07.09.2018
comment
Вот ссылка на документацию с примерами и пояснениями: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person ; 13.06.2019
comment
@Doug Благодаря @parsonsbots половина пути должна быть объяснена. Вот остальное: developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/ - person yckart; 08.07.2019
comment
это плохое решение. попробовать +не определено - person Jiraff537; 16.10.2019