Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 24位无符号整数_Javascript_C++_C_Byte_Bit Shift - Fatal编程技术网

Javascript 24位无符号整数

Javascript 24位无符号整数,javascript,c++,c,byte,bit-shift,Javascript,C++,C,Byte,Bit Shift,我开始使用HART(公路可寻址远程传感器)协议,我发现了一些东西,可以说是不同的,我试图理解它,更准确地说是uint24。据我所知,该结构在内部使用UInt32进行存储和大多数其他常见的预期整数功能,因此使用24位整数不会节省内存。但我的问题是如何将UInt32转换为这种特定类型,我在Javascript中找到了这些代码行,但我不知道这些左移的目的是什么 var getUint24 = function(bytes) { return (DataView(bytes.buffer).ge

我开始使用HART(公路可寻址远程传感器)协议,我发现了一些东西,可以说是不同的,我试图理解它,更准确地说是uint24。据我所知,该结构在内部使用UInt32进行存储和大多数其他常见的预期整数功能,因此使用24位整数不会节省内存。但我的问题是如何将UInt32转换为这种特定类型,我在Javascript中找到了这些代码行,但我不知道这些左移的目的是什么

var getUint24 = function(bytes)
{
    return (DataView(bytes.buffer).getUint16(0) << 8) + DataView(bytes.buffer).getUint8(0 + 2);
}
如果有人能帮助我理解这些转变的目的,我将不胜感激,而且非常欢迎C/C++版本。

简短回答
  • 移位是将值段提取为较小数据类型的一部分(在应用掩码之后)
摘要 移位和求和是在读/写帧小于值的长度时打包/解包值的方法。假设我们有4位值:
1011
。我们只能通过2位帧读取它:
[10],[11]

假设我们从左到右读取流

# offset 0 bits
a = stream(0)      # a = 10
a << 2             # a = 1000

b = stream (2)     # b = 11

return a + b       # 1000 + 11 = 1011
同样地,
字节。缓冲区可以将值保留为
[XY,Z]
[Z,XY]
getUintX(偏移量)
对我们隐藏了这些细节。但是,如果您想编写自己的转换器,则需要研究您的案例中的格式

ToBytesInt32BigEndian示例 这里我们看到了包装值的另一个关注点——应用掩码

例如,我们有32位值
AB CD EF 12
。我们可以应用掩码来提取所需的值段

例如,如果我们有3位值
011
并且想要获得第二位的值,我们需要应用&-mask,其中根据
1
计算的主题位保持原始值,而根据
0
计算的其余位将任何值转换为
0

masked    = 011 & 010    # 010
bit_value = masked >> 1  # 001
与我们的
ABCDEF12

x = 0xABCDEF12 & 0xFF000000   # x = 0xAB000000
x >> 24                       # x = 0x000000AB
...

这样我们将得到数组
[0xAB,0xCD,0xEF,0x12]
。在不移位的情况下,我们得到的数组
[0xAB000000,0x00CD0000,0x0000EF00,0x00000012]
不是我们想要的。

通常无符号整数作为其十六进制表示形式存储在内存中(对于其他类型来说非常不同)。左/右移位只是将字节的某些位置向左/右“移动”,用零填充新的孔,并丢失移出的字节。移动到最右边的位置会给您一个唯一的字节。与
&
一起使用的遮罩只需选择一些位置,其余位置归零。
masked    = 011 & 010    # 010
bit_value = masked >> 1  # 001
x = 0xABCDEF12 & 0xFF000000   # x = 0xAB000000
x >> 24                       # x = 0x000000AB
...