【问题标题】:JavaScript Bitwise And operatorJavaScript 按位与运算符
【发布时间】:2019-12-15 21:40:16
【问题描述】:

这是一个 JavaScript 程序,假设返回 (a & b) 的最大值,该值也小于 k(即 a & b

function data(n, k) {
  var res = [];

  for (var i = 1; i <= n; i++) {
    for (var j = 2; j <= n; j++) {
      if (i >= j) continue;

      let a = i.toString(2);
      let b = j.toString(2);
      var c = a & b;

      c = parseInt(c, 2);
      res.push(c)
    }
  }

  var res = res.filter(function(e) {
    return e < k;
  });
  
  return Math.max(...res);
}

console.log( data(955, 236) );

它返回 234,而不是 235... 我尝试过其他方法,例如 Reduce 和所有...但我认为我的问题源于我比较 a & b 的按位和...

【问题讨论】:

  • 请测试您发布的代码。它不返回 234,它记录一个错误。你有 935 次迭代,每次迭代 935 次...... 874,225 次迭代计算我没有最模糊的想法(与二进制,.. 按位,.. 香蕉有关?)。当然,无论做什么都超出了调用堆栈的荒谬数量。确定 235 小于 236 的工作量太大。
  • 我有...我返回234....这个挑战其实来自hackerrank
  • 点击蓝色按钮运行问题代码:运行代码 sn-p。从未听说过 hackerrank,您能详细说明一下吗?是网站吗?如果是这样,请发布指向与此挑战相关的相关位置的链接
  • 我使用了那个按钮,它显示 234。Hackerrank 实际上是一个网站。我最终在网上找到了解决方案。我现在将发布答案。

标签: javascript arrays function bitwise-and


【解决方案1】:

说实话,我不知道这段代码应该做什么......但我可以告诉你,这段代码并没有像你想象的那样做。

let a = i.toString(2);
let b = j.toString(2);
var c = a & b;

toString 把它变成一个字符串。 toString(2) 变成一个字符串,表示二进制值。这与实际值不同。

位运算符,如&amp; 处理整数。编译器会尝试将字符串转换为数字……但此时它将以 10 为基数工作,因此,您将得到一个与预期完全不同的数字。

最像你的意思是c = i &amp; j

您不必将数字转换为二进制。在计算机内部,它们已经是二进制的。当您要求计算机将它们显示给您时,计算机只会将它们变成 base 10。

【讨论】:

  • toString turns it into a string. bitwise operators, like &amp; work on integers. 这有点误导。 "231"&amp;"132"231&amp;132 都可以。但如果toString(2) 将数字转换为二进制表示的字符串,则"11100111"&amp;"10000100"11100111&amp;10000100231&amp;132 不同
  • @t.niese 啊,真的。我确实更新了评论以反映这一点。
  • 是的,我知道按位计算并且可以处理整数,这就是为什么我在检查按位之前将其转换回整数并且... parseInt (c,2) 代码将其转换回整数。 . 这其实是来自hackerrank的挑战
  • 但它会在 在其上运行按位数学之后将其转换回来,并且按位数学会进行自己的转换。十进制的 231 = 二进制的 11100111,然后将其保存为字符串。按位运算符将该字符串转换为 11,100,111(DECIMAL)的数字,并以这种方式执行按位运算符。
  • 哦,对不起....按位并按照我的代码中所示完成...。我想将其转换为字符串,然后按位检查,然后我返回它返回一个整数,以便将它与 K 进行比较以获得最大值。
【解决方案2】:

函数数据(n, k) { 变量 res = 0;

  for (var a = 1; a <= n; a++) {
    for (var b = 2; b <= n; b++) {
      if (i >= j) continue;

        if ((a & b) < k && (a & b ) > res ) {
              res = ( a & b) ;
         }

    }

  }


  return res;
}
console.log ( data ( 955, 236) ) ;

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多