【问题标题】:JavaScript - Read Bit Value, is single Bit On (1) or Off (0)?JavaScript - 读取位值,是单个位打开(1)还是关闭(0)?
【发布时间】:2020-09-26 12:32:42
【问题描述】:

在 JavaScript 中,我如何知道单个 Bit 是 On (1) 还是 Off (0)?

function isBitOn(number, index)
{
  // ... ?
}

// Example:
let num = 13; // 1101

isBitOn(num, 0); // true   1
isBitOn(num, 1); // false  0
isBitOn(num, 2); // true   1
isBitOn(num, 3); // true   1

我知道在 JavaScript 中我们有 Bitwise Operations。但是我该如何使用它们,或者使用任何其他方法,读取单个位?

【问题讨论】:

标签: javascript binary bit-manipulation bitwise-operators bit


【解决方案1】:

将数字转换为二进制,然后检查位:

function isBitOn(number, index) {
  let binary = number.toString(2);
  return (binary[(binary.length - 1) - index] == "1"); // index backwards
}

let num = 13; // 1101

console.log(isBitOn(num, 0));
console.log(isBitOn(num, 1));
console.log(isBitOn(num, 2));
console.log(isBitOn(num, 3));

【讨论】:

  • 这将不起作用,除非您希望位从最高有效位到最低有效位进行编号。此外,如果输入数字不是整数,则调用.toString(2) 的结果字符串将包含一个“。”字符。
  • @GilEpshtain 注意它会产生错误的结果。
  • @Pointy 最重要的位总是在结果字符串的开头。是的,它不适用于小数,但问题中提供的 13 的结果是正确的。
  • @WaisKamal 但请注意 OP 中的预期结果。通常,在现代计算中,人们期望位 0 是 最低位。
  • @Pointy 我从你那里得知 OP 想要从右到左的位?
【解决方案2】:

JavaScript 保留了 C 二元运算符的传统。您使用“索引”将值 1 向左移动,然后将结果与您感兴趣的数字相加:

function isBitOn(number, index) {
  return Boolean(number & (1 << index));
}
console.log(isBitOn(13, 0));
console.log(isBitOn(13, 1));
console.log(isBitOn(13, 2));
console.log(isBitOn(13, 3));
console.log(isBitOn(13, 4));
console.log(isBitOn(13, 5));
console.log(isBitOn(13, 6));

请注意,这是按位 &amp; 运算符,而不是 &amp;&amp; 短路逻辑运算符。

另请注意,这些运算符将数字视为 32 位整数,因此它不适用于非常大的数字。

【讨论】:

  • 我错过了什么?让我们测试num = 13(13 是 1101)和index = 2。所以(1 &lt;&lt; 2) 是 4(4 是 0100)。现在让我们看看(1101 &amp; 0100) 是 0100。那么为什么当我运行它时我得到 1 而不是 0100。请帮助我理解
  • 您运行的是当前版本吗?它在返回之前将计算结果转换为布尔值。任何非零数转换为布尔值时为true
  • 如果你在没有改变的情况下运行版本,你会得到1 0 4 8 0 0
  • 好的,这是一个简单的数字到布尔转换。我在想我错过了什么。
  • @GilEpshtain 要获得 0 和 1,您可以使用 (number &gt;&gt;&gt; index) &amp; 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多