【问题标题】:How to differentiate between binary and hexadecimal values如何区分二进制和十六进制值
【发布时间】:2018-10-21 05:03:52
【问题描述】:

假设我需要用户输入二进制或十六进制值,程序将从那里获取。有没有办法区分他们输入的值是二进制还是十六进制?

我以为我已经通过检查字符串是否包含大于 1 的字母或数字来弄清楚它,但是在 101101 或其他类似的十六进制输入的情况下呢?甚至可以在没有任何其他上下文的情况下知道吗?

为了包括失败的尝试,我尝试了以下方法来检查字符串是否包含十六进制值可以的字母:

if (Number.isInteger(parseInt(input)))

但除了它没有解决上述问题(因为十六进制值并不总是有字母)之外,它也失败了,因为当字母混合到输入中时它仍然返回 true,因为它仍然以一种或另一种方式解析整数。

【问题讨论】:

  • 如您所见,有些值可能是二进制或十六进制,而您仅通过查看字符串就无法了解用户意图,这怎么可能?
  • @stephen.vakil 补充说,相同的数字可以是十进制或八进制,它仍然有效。如果有人在不询问他们的情况下将其写在纸上,您就无法告诉 IRL,因此我真的看不出您如何以编程方式进行操作。我认为读心模块尚未准备好进行 beta 测试。
  • @stephen.vakil 我有点知道这个问题的答案并认为是这样,但我想获得更有经验的开发人员的意见,因为我无法通过谷歌搜索转换器或正则表达式测试找到更多其他内容在我上面提供的值上失败了。

标签: javascript binary hex


【解决方案1】:

甚至可以在没有任何其他上下文的情况下知道吗?

不,不是。编程语言通常允许在各种数字系统中使用数字文字,但必须相应地标记它们。在 JavaScript 中:

  • 无前缀:十进制。示例:12345
  • 0b 前缀:二进制。示例:0b10101
  • 0o 前缀:八进制。示例:0o123
  • 0x 前缀:十六进制。示例:0x12345

您可以要求输入相同的符号,或者您提供另一个控件以允许用户选择系统(您仍然可以正确地为输入添加前缀)。


为了完整起见,这里有一个函数可以将这些输入中的任何一个转换为数字:

const radixTable = {
  '0b': 2,
  '0o': 8,
  '0x': 16,
};

function convert(str) {
  let radix = 10;
  if (radixTable.hasOwnProperty(str.slice(0, 2))) {
      radix = radixTable[str.slice(0,2)];
      str = str.slice(2);
  }
  return parseInt(str, radix);
}

['12', '0b1100', '0o14', '0xC'].forEach(
  str => console.log(`${str}:`, convert(str))
);

【讨论】:

  • 如果是普通人输入,可能更方便用户使用文本输入和单选按钮或下拉菜单来选择值的类型。尽管如此,这并没有改变您需要用户明确其意图这一事实
  • 嗯,这就是我的想法,但我想与更有经验的开发人员确认。我想让用户尽可能简单,让他们输入最少的信息(只是字符串),但看起来它需要的不止这些。感谢您提供信息丰富的答案。
  • @Mr.Smithyyy:如果目标受众知道二进制、八进制和十六进制数字是什么,那么他们可能也已经知道前缀了。
  • @FelixKling 他们可能会也可能不会(知道前缀),但前缀绝对是最好的选择,我只需要更多的文档。
【解决方案2】:

我不知道 JavaScript 有很多内置的高级数学功能。如果它是面向这个目的的,它可能会有更多的数值变量类型来给你更大的数字,比如 double 或 long。您可能希望创建一个对象,该对象具有一个属性来设置对象中的数字是十六进制还是十进制,然后是值。

let numberObj = {
    numberSystem: 'decimal',
    value: '4505'
}

【讨论】:

    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2012-05-24
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多