【问题标题】:Javascript bitwise operators - explanation required [duplicate]Javascript按位运算符 - 需要解释[重复]
【发布时间】:2017-11-09 08:50:03
【问题描述】:

我在 JS 中使用了一些代码,但遇到了这些(不相关的)表达式:

1) var r = (d + Math.random() * 16) % 16 | 0;

2) return c === 'x' ? r : (r & 0x3 | 0x8);

我阅读了一些有关按位运算符的信息,但在这种情况下没有帮助。 有人可以解释(最好是一步一步)它们是如何工作的吗?这两个表达式如何进行逻辑评估和运行?

提前致谢。

【问题讨论】:

  • 第一个似乎只是截断数字的技巧。 (2.34 | 0) === 2。第二个看起来很正常......你具体是什么在理解那里有困难?
  • 在 SO 和 across the internet 上有很多关于位运算符的问题。请包括您从所做的研究中收集到的信息。否则这个问题是“为我阅读这段代码”。我的意思是你可以把每一个操作都做成一个单独的行,然后调试每一个,看看它做了什么。
  • 你对二进制表示有基本的了解吗?不要求居高临下,只是想了解您正在寻找什么样的答案。
  • 滥用网站并希望有人愿意满足你并不能完全保护你免受那些试图执行规则的人的伤害。在某些情况下,有人可能会回答这种广泛性质的问题,但您不应该对结束投票和规则提醒感到惊讶。
  • 对,要么这是重复的,要么是跑题了。

标签: javascript bitwise-operators


【解决方案1】:

第一个语句几乎与位运算符无关。 它只是意味着:

  • 将 0 到 15 之间的随机数分配给 r,但如果变量 d 未定义,则给我 0。它使用数学事实,即任何数的模 16 会在 [0..15] 范围内和按位或0 是一个身份操作,但有一个例外。处理undefined 的JavaScript 逻辑表明,如果没有| 0,当d 未定义时,您将在r 中得到NaN

第二条语句确实使用了位运算符。

  • x & 0x03x BITWISE_AND 0011 相同,它返回 x 的最低 2 位。 x | 0x8 始终设置第 4 位。因此,c 将是10..,其中点是 r 的最低 2 位。当然,只有当c 是一个字符串并且等于x 时才会发生。

我强烈建议您阅读https://www.w3schools.com/js/js_bitwise.asp 并进行一些实验。

【讨论】:

  • 非常感谢@AlexPakka!
  • 通常3只设置了底部两个
  • @harold,谢谢!更新了我的答案。我很着急……一边看着& 0x3 | 0x8,一边在想& 0x7 | 0x8
【解决方案2】:

基本上,您可以使用蛮力方法并查看对象中返回了哪些值,其中一个用于c === ''c === 'x'

function x() {
    var r = (d + Math.random() * 16) % 16 | 0;  // the last or returns an integer value
    return c === 'x' ? r : (r & 0x3 | 0x8);
}

var d = 0,  // does not matter, because of % operator
    c = '',
    i,
    values = {},
    v;

for (i = 0; i < 1e6; i++) {
    v = x();
    values[v] = values[v] || 0;
    values[v]++;
}
console.log(values);

values = {};
c = 'x';
for (i = 0; i < 1e6; i++) {
    v = x();
    values[v] = values[v] || 0;
    values[v]++;
}
console.log(values);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 只是想指出,d 很重要。如果d === undefined 你会得到不同的结果。
  • @AlexPakka,我假设d 包含一个数值。
  • 有效假设,但在第 1 行末尾的 | 0 没有任何意义。我有两个理论:这是一个面试问题,或者这段代码的开发者想尽可能地迷惑未来的维护者。
  • @AlexPakka,看起来这是生成 UUID/GUID 的一部分。 source1, source2
  • @NinaSholz 哇。 Vielen Dank für den Hinweis!我现在感觉好多了,因为我没有帮助任何人作弊。
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2014-01-29
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多