【问题标题】:Syntax Error: unexpected identifier - Binary algorithm code. Help me improve it语法错误:意外标识符 - 二进制算法代码。帮我改进一下
【发布时间】:2020-04-21 05:47:04
【问题描述】:

我想做的事: 一些如何创建一个更准确地表示二进制系统的变量,因为我只包含了前 12 个数字,但是如果我需要许多更高的数字怎么办!它需要更通用。

我尝试做的事情:将进入 n 的二进制数推送到一个名为 one 的新数组中,然后返回数组的长度作为答案。

var countBits = function(n) {
  Let binary = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048];
  var one = [];
  for( let i = 0; i < binary.length; i++) {
  if( n = [i]) { one.push([i])},
  if( n > [i]) { one.push([i])},
  else { return "negative"};
  return one.length;

};

【问题讨论】:

  • 请解释if语句中的逗号。
  • 哇!谢谢你。我试图做多个 if 语句,所以我使用了一个逗号,这是不正确的。你可以说我还是个新手!
  • 嗨 Vix,您的代码中有几个问题:let 没有大写字母;比较两个实体使用双(==)或三等号(===); if 语句中不应有逗号;最后,您在 for 循环中缺少右括号。
  • Ivan 非常感谢你这么清楚!

标签: javascript arrays algorithm binary


【解决方案1】:

句法问题

根据我的评论,这里是更正:

  • let 而不是 Let
  • 删除两个, 上的if statements
  • 缺少}

我建议您使用某种编辑器来帮助整理和验证您的代码。

它会为你节省很多时间!

var countBits = function(n) {
  let binary = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048];
  var one = [];
  for (let i = 0; i < binary.length; i++) {
    if (n == [i]) {
      one.push([i])
    }
    if (n > [i]) {
      one.push([i])
    } else {
      return "negative"
    }
  }
  return one.length;
};

解决实际的位计数器问题

现在问题来了,你想:

计算给定数字的二进制表示上设置的位数

只要n 不是正数或不为零,我们就会运行我们的循环。在每个循环中,我们将检查n 是否为奇数,在这种情况下,我们会将1 添加到我们的计数器中。然后我们将n除以2。

const countBits = function(n) {
  let count = 0;
  while (n > 0) {
    count += (n % 2 != 0);   // add one to the counter if n is pair
    n = Math.floor(n/2);     // divide n by 2
  }
  return count;
}

您可以使用二元运算符执行完全相同的操作:&amp;(按位与)和&gt;&gt;(右移)。我们将直接处理n 并倒计时以确定设置的位数。

这是我们的两行代码,现在使用&amp;&gt;&gt;

  1. 在每个循环中,我们将n1 进行比较逐位。如果n 可被2 整除,则n &amp; 1 基本上等于1,否则等于0

  2. 然后我们将n 移动一位,即将所有位向右移动。 n &gt;&gt;= 1 等同于将n &gt;&gt; 1 的结果赋值给nn = n &gt;&gt; 1

const countBits = function(n) {
  let count = 0;
  while (n > 0) {
    count += n & 1;
    n >>= 1;
  }
  return count;
}

更多关于bitwise operators


单线

如果你想测试你的代码,这里有一个作弊的版本来比较你的结果:

const countBits = function(dec) {
  return (dec >>> 0).toString(2).split('').filter(Number).length;
}

它首先将数字转换为其二进制表示的字符串,然后将其转换为0s 和1s 的数组,用filter 删除零,然后计算剩余元素的数量。

【讨论】:

  • 非常感谢伊万!有什么我仍然想念的东西真的很愚蠢,因为它每次都返回“负数”吗?!感谢您的提示!
  • @Vix 请记住accept the answer。谢谢。
  • @Vix 你到底想用这个功能实现什么?我将编辑我的答案。
  • 谢谢@Marco!我知道我必须做点什么,当你发帖时我正在阅读规则! ;)
  • @Ivan 如果您将整数作为参数传递,该函数将能够将其视为二进制数,然后为您提供转换后的形式中使用的总数。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
相关资源
最近更新 更多