javascript - 添加到 Uint32Array 时 0x100000000 >>> 0 在 Javascript 中实际上做了什么
问题描述
我最近问了我关于堆栈溢出的第一个问题(请参阅)For loop inside another for loop crash in Javascript ,并得到了一个似乎有效的绝妙答案(感谢 Ry-)但是我一直在研究代码以找出原因/如何正在工作并且对以下语句“0x100000000 >>> 0”感到困惑
我的理解(正如几天前所了解的)是按位字符 >>> 通过从左侧推入零来向右移动,最右边的位会脱落。因此“ >>> 0 ”不会对等式没有影响吗?
但是,当我按位删除代码不起作用?有人可以解释为什么吗?
const world = document.getElementById('canvas');
const context = world.getContext('2d');
const start = performance.now();
const {width, height} = world;
const random32 = new Uint32Array(width * height);
for (let i = 0; i < random32.length; i++) {
//THIS IS THE LINE I AM CONFUSED ABOUT
random32[i] = Math.random() * 0x100000000 >>> 0;
}
我已经尝试删除 >>> 0" 但是没有它代码就无法工作。
我一直在尝试了解有关按位字符和 Uint32Arrays 的更多信息,但没有找到任何解释。
解决方案
JavaScript 不区分浮点数和整数。但是,有些操作可以。>>>
就是这样的操作。Math.random() * 0x100000000
将是 0 到 0x100000000 之间的浮点数。但是,>>>
将其强制为正整数,因为>>>
仅对整数进行操作。然后它将该整数移动 0 位,这实际上什么也没做。
tl; dr:x >>> 0
在非负数上与x|0
和相同Math.floor(x)
。
推荐阅读
- c++ - 为单元测试调用继承类的私有成员
- python - 我需要制作一个 python 项目,但我知道 C#,但不知道如何转换它
- python - 在命令行中运行 python 文件没有输出
- c# - .net MVC中是否有任何方法可以将数据库日期导出到不在本地机器中的文件中,并作为文件附件与电子邮件一起发送。?
- sql - 为什么在窗口函数中使用 GROUP BY
- sql - SQL Server 中的 AVG
- java - 处理中带有 loadPixels() 的渐变
- python - 使用 VScode (python) 键入提示错误
- javascript - 重写_.invoke
- .net - 在.Net Core 中拦截用于运行时映射的假网址?