JavaScript类型数组-不同视图-2

JavaScript类型数组-不同视图-2,javascript,Javascript,几天前,我发布了几个关于这个的问题,得到了一些非常好的回复 我的第二个问题涉及两个视图,8位数组和32位缓存数组。通过在8位中放置0、1、2、3,我在32位中获得了50462976。如前所述,32位值的原因得到了很好的解释 我可以通过以下代码实现同样的功能: var buf = new ArrayBuffer(4); var arr8 = new Int8Array(buf); var arr32 = new Int32Array(buf); for (var x = 0; x < bu

几天前,我发布了几个关于这个的问题,得到了一些非常好的回复

我的第二个问题涉及两个视图,8位数组和32位缓存数组。通过在8位中放置0、1、2、3,我在32位中获得了50462976。如前所述,32位值的原因得到了很好的解释

我可以通过以下代码实现同样的功能:

var buf = new ArrayBuffer(4);
var arr8 = new Int8Array(buf);
var arr32 = new Int32Array(buf);

for (var x = 0; x < buf.byteLength; x++) {
    arr8[x] =
        (x << 24) |
        (x << 16) |
        (x <<  8) |
         x;
}

console.log(arr8);      // [0, 1, 2, 3]
console.log(arr32);     // [50462976]
var buf=newarraybuffer(4);
var arr8=新的Int8Array(buf);
var arr32=新的Int32Array(buf);
对于(变量x=0;x(x对于
Int8Array
而言,缓冲区使用的内存被解释为8位字节,对于
Int32Array
而言,被解释为32位字。8位数组中字节的顺序与另一个数组中单个32位字中字节的顺序相同,因为它们是相同的字节涉及“力学”;它只是查看相同4字节内存的两种方式

在C中,如果分配一个四字节数组,然后创建一个指向同一位置的
int
指针,就会得到完全相同的效果

此外,这里的表达式:

arr8[x] =
    (x << 24) |
    (x << 16) |
    (x <<  8) |
     x;

您正在将
x
的值向上移动到范围中,当值实际保存到(8位)中时,这些范围将被截断数组元素。

缓冲区使用的内存对于
Int8Array
解释为8位字节,对于
Int32Array
解释为32位字。8位数组中字节的顺序与另一个数组中单个32位字中字节的顺序相同,因为它们是相同的字节不涉及“力学”;它只是查看相同4字节内存的两种方法

在C中,如果分配一个四字节数组,然后创建一个指向同一位置的
int
指针,就会得到完全相同的效果

此外,这里的表达式:

arr8[x] =
    (x << 24) |
    (x << 16) |
    (x <<  8) |
     x;

您正在将
x
的值向上移动到范围中,当值实际保存到(8位)数组元素中时,这些范围将被截断。

基本上,您的缓冲区如下所示:

00000000 00000001 00000010 00000011
当作为
Int8Array
处理时,它分别读取每个8位组:0、1、2、3


当作为
Int32Array
处理时,它读取32位组(即4个8位组)以获得50462976

基本上,您的缓冲区如下所示:

00000000 00000001 00000010 00000011
当作为
Int8Array
处理时,它分别读取每个8位组:0、1、2、3


当作为
Int32Array
处理时,它读取32位组(即4个8位组)以获得50462976

+1,用于解释前8位之后的位被截断。+1用于解释前8位之后的位被截断。我可以理解如何从32位数组中获得50462976。我没有得到的是“|“符号。因为它的意思是或者在上面的上下文中是如何工作的。这就是为什么我要找“机械师”这是一个按位OR。在这种情况下,因为x小于8,它实际上与
+
@NiettheDarkAbsol完全相同。这救了我的命…感谢这个回答,我可以理解如何从32位数组中得到50462976。我没有得到的是“|”符号。因为它的意思是或者在上面的上下文中它是如何工作的。这就是为什么我要问这个过程的“机制”。它是一个位OR。在这个例子中,因为x小于8,它实际上与
+
@NiettheDarkAbsol完全相同。这救了我的命…谢谢你的回答