首页 > 解决方案 > 添加到 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 的更多信息,但没有找到任何解释。

标签: javascripthexbit-manipulation

解决方案


JavaScript 不区分浮点数和整数。但是,有些操作可以。>>>就是这样的操作。Math.random() * 0x100000000将是 0 到 0x100000000 之间的浮点数。但是,>>>将其强制为正整数,因为>>>仅对整数进行操作。然后它将该整数移动 0 位,这实际上什么也没做。

tl; dr:x >>> 0在非负数上与x|0和相同Math.floor(x)


推荐阅读