【问题标题】:Method implementation that takes 3 parameters and returns a binary number采用 3 个参数并返回二进制数的方法实现
【发布时间】:2021-02-13 06:31:13
【问题描述】:

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

【问题讨论】:

  • 不知道为什么要用(dec >>> 0).toString(2),什么时候可以用dec.toString(2)
  • 您应该“告诉”函数如何中断输入,就像您在问题的 text 中所做的那样:8, 4, 1 (255, 15, 1)。因此,传递/硬编码具有“或更多”二进制长度的数组。那么这将是一件简单的事情,只需大约一行代码......
  • 如果'dec'不是十进制,不是数字,负数,大于某个阈值(255,15,1,?)怎么办?
  • 借用下面的答案 (@Lemondoge):function dec2bin(dec, digits) { if(typeof(dec)=="number" && dec%1==0 && dec>=0 and dec<Math.pow(2, digits)) return dec.toString(2).padStart(digits, "0"); return undefined; }
  • 那么你可以使用:function encrypt(userDetailsArray, encriptDigitsArray) { if(userDetailsArray.length<=encriptDigitsArray.length) return userDetailsArray.map((detail, index)=>dec2bin(detail, encriptDigitsArray[index])).join(""); return undefined; }

标签: javascript binary bit-manipulation bitwise-operators


【解决方案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 条件轻松添加它,而对于动态添加零,您不能使用多个休息参数因为这是函数声明中只允许有一个剩余参数的限制。虽然,你可以通过使用一个休息参数来解决它(如果你有时间考虑一下)。顺便说一句,您还可以使用对象、单个或多个数组作为参数来使其动态化。

【讨论】:

  • 为什么这个答案会被接受?它没有给出 13 个二进制数字的答案...它给出 1111011011,而它应该给出 0001111011011。
  • 当你使用不定参数时,你怎么能说它总是13位二进制数字。
  • 你现在快乐吗?
  • 这不是我快乐的问题。这是一个给出预期结果的代码问题。您的代码仍然没有给出预期的结果:操作要求 8 位 + 4 位 + 1 位连接字符串 - 在 文本 中。如果提供的参数多于或少于 3 个,操作人员不清楚该怎么做。
  • 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))

【讨论】:

  • 你的意思是padStart
  • 没有。 padStart 会在后面添加零,如果不是不可能的话,这将很难转换回十进制。
  • 二进制中的15是1111。如果我们需要8位数字,它将是00001111。不是11110000作为您的解决方案,即240...
  • 来帮忙!如果少于 3 个、没有或多于 3 个参数,我们应该怎么做? op只知道... :)
  • 请问您对我的回答有何看法?
【解决方案3】:

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

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

【讨论】:

  • @mrhr,谢谢!我希望我已经涵盖了所有案例...感谢您的投票! (如果不是你 - 提示...提示... :))
猜你喜欢
  • 1970-01-01
  • 2016-08-23
  • 2016-12-26
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多