采用 3 个参数和 returns 二进制数的方法实现

Method implementation that takes 3 parameters and returns a binary number

我找到了一种将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

这应该有效:

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))

根据您的要求用参数加密用户年龄(最多 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);

如果参数号未知,您可以使用剩余参数。剩余参数语法允许我们将不定数量的参数表示为数组。所以你可以使用任意数量的参数。

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参数来解决(有空可以考虑一下)。顺便说一句,你也可以使用对象、单个或多个数组作为参数,使其成为动态的。

这是一个函数 encrypt,它适用于任意数量的参数数组,只要您提供足够长的加密数字数组,并且输入是 non-negative 整数 - 如果任何不满足条件,返回undefined

function dec2bin(dec, digits) {
  if(typeof(dec)=="number" && dec%1==0 && dec>=0 && 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!="" && encriptDigitsArray.length) {
    result.push(parseInt(bin.slice(0,encriptDigitsArray[0]), 2));
    bin=bin.slice(encriptDigitsArray[0]);
    encriptDigitsArray.shift();
  }
  return result;
}

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