繁体   English   中英

通过将它们转换为更大的 integer 数据类型来一次添加整个字节数组是否有效?

Is it valid to add an entire array of bytes at once by converting them to a larger integer data type?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如果我有两个包含u8的 arrays ,我可以将它们转换为更大的 integer 类型以减少我需要做的添加数量吗? 例如,如果两个字节 arrays 每个包含 4 个字节,我可以将它们每个都变成一个u32 ,进行加法,然后将它们转换回来吗?

例如:

let a = u32::from_ne_bytes([1, 2, 3, 4]);
let b = u32::from_ne_bytes([5, 6, 7, 8]);

let c = a + b;
let c_bytes = u32::to_ne_bytes(c);

assert_eq!(c_bytes, [6, 8, 10, 12]);

此示例生成正确的 output。

  1. 这是否总是导致正确的 output (假设没有溢出)?
  2. 这比单独添加要快吗?
  3. 它适用于其他 integer 类型吗? 例如 u32 中的 2 个u16u16 u32 u32

如果这存在并且很常见,它叫什么?

1 个回复
  1. 这是否总是导致正确的 output (假设没有溢出)?

是的。 如果每个总和小于 256,这将根据需要添加字节。 您在每种情况下都指定了“ne”,用于本地字节序。 无论本机字节顺序如何,这都会起作用,因为操作是按字节计算的。

如果您编写代码来实际检查总和是否都在范围内,那么您几乎肯定会撤消您获得的任何额外加速(如果有的话)。

  1. 这比单独添加要快吗?

也许。 唯一确定的方法是测试。

  1. 它适用于其他 integer 类型吗? 例如 u32 中的 2 个u16u16 u32 u32

可以,但是需要注意字节顺序。

如果这存在并且很常见,它叫什么?

这并不常见,因为它通常是不必要的。 这种类型的优化使代码更难阅读,并引入了相当大的复杂性和错误机会。 Rust 编译器和它们之间的 LLVM 能够找到您永远不会想到的极其复杂的优化,同时您的代码保持可读性和可维护性。

如果它有一个名字,它就是 SIMD,而且大多数现代处理器本身就支持它的一种形式(SSE、MMX、AVX)。 您可以使用内置函数手动执行此操作,例如core::arch::x86_64::_mm_add_epi8 ,但 LLVM 可能会自动执行此操作。 尝试手动执行此操作可能会干扰 LLVM 否则会执行的优化,同时使您的代码更容易出错。


我无论如何都不是汇编代码方面的专家,但我查看了为以下两个函数生成的程序集

#[no_mangle]
#[inline(never)]
pub fn f1(a1: u8, b1: u8, c1: u8, d1: u8, a2: u8, b2: u8, c2: u8, d2: u8) -> [u8; 4]{
    let a = u32::from_le_bytes([a1, b1, c1, d1]);
    let b = u32::from_le_bytes([a2, b2, c2, d2]);
    u32::to_le_bytes(a + b)
}

#[no_mangle]
#[inline(never)]
pub fn f2(a1: u8, b1: u8, c1: u8, d1: u8, a2: u8, b2: u8, c2: u8, d2: u8) -> [u8; 4]{
    [a1 + a2, b1 + b2, c1 + c2, d1 + d2]
}

f1的程序集:

movzx r10d, byte ptr [rsp + 8]
shl ecx, 24
movzx eax, dl
shl eax, 16
movzx edx, sil
shl edx, 8
movzx esi, dil
or esi, edx
or esi, eax
or esi, ecx
mov ecx, dword ptr [rsp + 16]
shl ecx, 24
shl r10d, 16
movzx edx, r9b
shl edx, 8
movzx eax, r8b
or eax, edx
or eax, r10d
or eax, ecx
add eax, esi
ret

对于f2

add r8b, dil
add r9b, sil
add dl, byte ptr [rsp + 8]
add cl, byte ptr [rsp + 16]
movzx ecx, cl
shl ecx, 24
movzx edx, dl
shl edx, 16
movzx esi, r9b
shl esi, 8
movzx eax, r8b
or eax, esi
or eax, edx
or eax, ecx
ret

更少的指令并不一定会让它更快,但这不是一个糟糕的指导方针。


在仔细测量和测试之后,将这种优化视为最后的手段。

1 将字节数组转换为std数据类型

嗯你好 我试图编写一个自定义堆栈内存分配器来帮助我进行游戏编程,但遇到了问题。 因此,假设我的分配器具有char *缓冲区,并且我想为int获取一些内存: 现在,它可以正常工作并打印出6。但是,当我尝试类似的操作时: ...这给我带来了Bad Ptr问题,以及分段错误,导致程 ...

2 如何将字节数组转换为整数数组

我正在一个项目中,我在其中接收图像数据作为字节数组(每个像素1字节)。 每个字节代表一个灰度整数(0-255)。 为了对数据执行许多功能,我需要将字节数组转换为整数数组。 请帮我.. ...

2011-05-19 10:52:14 2 8933   java
3 如何将字节数组转换为整数数组

我正在使用以下方式读取文件: 我在这里发现。 是否可以将byte array buf转换为Int Array ? 将Byte Array转换为Int Array会占用更多空间吗? 编辑:我的文件包含数百万个整数,例如 100000000 200000000 .....(使 ...

4 将整数数组转换为字节数组[重复]

这个问题在这里已有答案: 如何将int []转换为byte [] 6个答案 我目前正在编写一个通过回调与Windows驱动程序交互的小应用程序。 此应用程序记录各种XY坐标和按钮状态,以整数表示。 应用程序将通过本地网络将此数据发送回调用。 我对数据包的体验至 ...

6 是否可以在 Powershell 中将字节数组转换为 8 位有符号整数数组?

我正在尝试在 Powershell 中将十六进制字符串转换为 8 位有符号整数数组。 我使用以下函数将十六进制字符串(例如 A591BF86E5D7D9837EE7ACC569C4B59B)转换为字节数组,然后我需要将其转换为 8 位有符号整数数组。 使用该函数后,十六进制转换为字节数组,如下 ...

9 字节数据类型的转换

请解释下面的代码如何工作,因为我们知道java中的字节数据类型允许从-128到127的范围。 我的代码段是: 输出:-116 ...

2018-05-26 14:33:43 4 39   java/ byte
10 将字节数组转换为整数

我正在使用C语言开发IJVM项目。 首先,我将一个二进制文件导入到我的程序中,该文件应该被解析为单词。 现在我创建了一个包含二进制文件的变量(文本),我需要将其转换为单词数组。 我有一个暗示 这只适用于前4个字节,我需要的是一个result数组。 我试过这样的东西,但它从来没 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM