Реализация метода, которая принимает 3 параметра и возвращает двоичное число

#javascript #binary #bit-manipulation #bitwise-operators

#javascript #двоичный #манипулирование битами #побитовые операторы

Вопрос:

Я нашел метод, который преобразует 1 число в двоичное число.

 function dec2bin(dec){
    return (dec >>> 0).toString(2);
}
  

Как реализовать метод, который принимает 3 параметра (или больше, если возможно) и превращает их в одно двоичное число.

например:

Зашифровать пользователя с помощью параметров

  1. Возраст (до 255-> 11111111)
  2. Количество отпусков (до 15-> 1111)
  3. В отпуске или нет (1 или 0)

создать(30, 13, 1);

Ожидается, что 3 будут сложены вместе (00011110) (1101) (1): 0001111011011

Комментарии:

1. Я не знаю, зачем использовать (dec >>> 0).toString(2) , когда можно использовать dec.toString(2) .

2. Вы должны «сообщить» функции, как разбить ввод, как вы это сделали в тексте вопроса: 8, 4, 1 (255, 15, 1). итак, передайте / жестко запрограммируйте массив с этими «или более, если возможно» двоичными длинами. Тогда это будет просто сделать примерно с одной строкой кода…

3. что делать, если ‘dec’ не является десятичным, не является числом, отрицательным, больше определенного порога (255, 15, 1, ?)?

4. Заимствование из ответов (@Lemondoge) ниже: function dec2bin(dec, digits) { if(typeof(dec)=="number" amp;amp; dec%1==0 amp;amp; dec>=0 and dec<Math.pow(2, digits)) return dec.toString(2).padStart(digits, "0"); return undefined; }

5. Затем вы можете использовать: function encrypt(userDetailsArray, encriptDigitsArray) { if(userDetailsArray.length<=encriptDigitsArray.length) return userDetailsArray.map((detail, index)=>dec2bin(detail, encriptDigitsArray[index])).join(""); return undefined; }

Ответ №1:

В соответствии с вашим требованием зашифруйте пользователя параметрами возраст (до 255-> 11111111), количество отпусков (до 15-> 1111), в отпуске или нет (1 или 0)

 const create = (age, noOfVacations, onVacation) => {
  return (
    age.toString(2).padStart(8, '0')  
    noOfVacations.toString(2).padStart(4, '0')  
    onVacation.toString(2).padStart(1, '0')
  );
};
const ret = create(30, 13, 1);
console.log(ret);  

Кстати, вы можете реорганизовать приведенный выше код, чтобы сделать его более пригодным для повторного использования, преобразовав разделенный двоичный код в десятичный с функцией заполнения нулем.

 const binToDecWithZeroPad = (param, n) => param.toString(2).padStart(n, '0');

const create = (age, noOfVacations, onVacation) =>
  binToDecWithZeroPad(age, 8)  
  binToDecWithZeroPad(noOfVacations, 4)  
  binToDecWithZeroPad(onVacation, 1);

const ret = create(30, 13, 1);
console.log(ret);  

Если номер параметра неизвестен, вы можете использовать параметр rest. Синтаксис параметра Rest позволяет нам представлять неопределенное количество аргументов в виде массива. Таким образом, вы можете использовать любое количество параметров.

 const create = (...params) => {
  let str = '';
  params.forEach((x) => (str  = x.toString(2)));
  return str;
};
const ret = create(30, 13, 1);
console.log(ret);  

Обновление: я не проверял, является ли параметр в моем коде нечисловым, десятичным или отрицательным, потому что, если вам нужно его проверить, вы можете легко добавить его, используя простое условие if, а что касается динамического добавления нуля, вы не можете использовать более одного параметра rest, потому что это ограничение, что только один параметрпараметр rest разрешен в объявлении функции. Хотя вы можете решить эту проблему, используя один параметр rest (подумайте об этом, если у вас есть время). Кстати, вы также можете использовать объект, один или несколько массивов, что хотите, в качестве параметра, чтобы сделать его динамическим.

Комментарии:

1. Почему этот ответ принят? Он не дает 13 двоичных цифр ответа… Он выдает 1111011011, когда он должен выдавать 0001111011011.

2. Когда вы используете неопределенный параметр, то как вы могли бы сказать, что это всегда будет 13 двоичных цифр.

3. Теперь ты доволен?

4. Дело не в том, что я счастлив. Это вопрос кода, дающего ожидаемые результаты. Ваш код по-прежнему не дает ожидаемых результатов: op запросил 8-значную 4-значную 1-значную объединенную строку — в тексте . В op неясно, что делать, если указано более или менее 3 параметров.

5. OP также смущает, если более 3 входных данных.

Ответ №2:

Это должно сработать:

 function dec2bin(dec){
  return (dec >>> 0).toString(2);
}
function create(age, vacationNumber, vacation) {
  var a = dec2bin(age).padStart(8, "0"); // padEnd adds zeros to match size
  var b = dec2bin(vacationNumber).padStart(4, "0");
  var c = vacation==true||vacation==1 ? 1 : 0;
  return a   b   c;
}
console.log(create(15, 20, 1))  

Комментарии:

1. Вы имели в виду padStart ?

2. Нет. padStart добавит нули в конец, что было бы сложно, если не невозможно, преобразовать обратно в десятичное число.

3. 15 в двоичном формате равно 1111. Если нам нужно 8 цифр, это будет 00001111. не 11110000 в качестве вашего решения, а 240…

4. Здесь, чтобы помочь! Что нам делать, если аргументов меньше 3, нет или более 3? op знает только … 🙂

5. могу ли я узнать ваше мнение о моем ответе?

Ответ №3:

Вот функция encrypt , которая работает с массивом любого количества аргументов, при условии, что вы предоставляете достаточно длинный массив цифр encript, а входные данные представляют собой неотрицательные целые числа — если какое-либо из условий не выполнено, undefined возвращается:

 function dec2bin(dec, digits) {
  if(typeof(dec)=="number" amp;amp; dec%1==0 amp;amp; dec>=0 amp;amp; dec<Math.pow(2, digits))
    return dec.toString(2).padStart(digits, "0");
  return undefined;
}
function encrypt(userDetailsArray, encriptDigitsArray) {
  if(userDetailsArray.length<=encriptDigitsArray.length) {
    var result=(
      userDetailsArray.map(
        (detail, index) => dec2bin(detail, encriptDigitsArray[index])
      )
    );
    if(result.includes(undefined))
      return undefined;
    else
      return result.join("");
  }
  return undefined;
}

console.log(encrypt([30,13,1],[8,4,1])); /* your example */
console.log(encrypt([30,13],[8,4,1])); /* less input */
console.log(encrypt([30],[8,4,1])); /* even less input */
console.log(encrypt([30,13,1,100,5],[8,4,1,7,4])); /* more input and encript digits */
console.log(encrypt([999,13,1],[8,4,1])); /* bad input */
console.log(encrypt([30,13,1],[8,4])); /* not enough encript digits */  

Расшифровать (без проверки правильности аргументов):

 function decrypt(bin, encriptDigitsArray) {
  var result=[];
  while(bin!="" amp;amp; encriptDigitsArray.length) {
    result.push(parseInt(bin.slice(0,encriptDigitsArray[0]), 2));
    bin=bin.slice(encriptDigitsArray[0]);
    encriptDigitsArray.shift();
  }
  return resu<
}

console.log(decrypt("0001111011011",[8,4,1]));
console.log(decrypt("000111101101",[8,4,1]));
console.log(decrypt("00011110",[8,4,1]));  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Комментарии:

1. @mrhr, спасибо! Надеюсь, я рассмотрел все случаи… Спасибо за голосование! (Если это были не вы — подсказка… подсказка … :))