问题标签 [bit-packing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
94 浏览

c - 使用位域压缩字符串

我必须对字符串数组进行编码,以便: 1. 编码输出是一个具有最小可能长度的单个字符串 2. 您应该能够稍后解码该字符串。字符串仅由小写字符组成。我不太擅长使用位域。. 当我将字母分配给 enc_string 时,我是否只需右移 3 位?或者我可以使用我创建的结构?另外我怎样才能确保我真正节省了空间。我不能使用 sizeof 因为它以字节为单位返回?

我该如何做位包装。

0 投票
1 回答
53 浏览

java - 将字节值转换为 int

我正在尝试将单个字节值存储到 int 中的某个位置,但是,我无法弄清楚如何做到这一点。我已将要存储在 int 中的字节转换为正确的值,但我不知道如何将它与值结合起来。

最简单的解决方案是从 int 中解压缩其他 3 个字节,然后将 4 个字节重新组合成一个 int,但这当然不会非常高效。

0 投票
2 回答
64 浏览

javascript - 按位打包/解包 - 任意值的通用解决方案

我正在尝试将此答案调整为任意数值。

假设我们有 3 个(无符号)数字:

v1, v2,v3

我们知道它们可能具有的各自最大值:

max1, max2, max3.

max1 * max2 * max3 < 2^32,

所以结果(打包值)在 32 位以内。

如何在没有“魔法”硬编码的情况下打包/解包它们?

0 投票
1 回答
57 浏览

indexing - 如何优化压缩时间序列数据集的倒排索引

我正在尝试以 25% 的压缩率压缩时间序列数据集。这对我来说变成了仇杀。

数据是 1 个月内的 1 分钟间隔历史股票报价(参见数据集注释),缺失数据为 0。这相当于大约 9000 个 uint32_t 类型的数据点(我不做小数)

我的第一次尝试是对所有数据使用 FastPFor 压缩。这导致了约 80% 的压缩比。还不够好。所以 -

我首先摆脱所有时间戳(明显)

然后我对历史数据进行了排序并删除了所有重复项。这将唯一值的数量从 ~ 5000 减少到 1000。从那里,我使用差分SIMD 压缩算法进一步压缩它。这些也有点包装。这导致最终约 5% 的压缩比。伟大的!问题来了。

要重建数据集,您必须能够将其按顺序放回原处。我的想法是为上面每个处理过的值设置倒排索引——每个索引都指向它的原始位置。这当然只是添加了 9000 个数字。这使尺寸几乎达到原始尺寸。

例子:

...

结果,我尝试压缩倒排索引。

  1. 对它们进行排序
  2. 去掉与前一个值 (RLE) 相比 +1 的任何值
  3. 使用 Lemire 的 SIMDCompression github 压缩每个索引列表(我还尝试了他的FastPFor算法)

不幸的是,这种压缩索引的尝试并不好。在实际压缩使用每个整数 20-64 位之后,它只产生了约 75% 的压缩率。请注意,之前我提到我使用的是 32 位数字。压缩使索引列表只有 1 个数字,是其原始大小的 2 倍(我希望它保持不变)。

使用倒排索引的尝试是徒劳的——当它与原始大小相当时,不足以证明额外处理是合理的。

我还有一些其他的想法:

  • 确定最常见的数字序列,使用“霍夫曼”类型编码,您可以在其中指定某个值来表示它。

  • 压缩算法在处理更多数据时效果更好 - 可能将所有索引连接到 1 个数组中,然后压缩一次?

压缩倒排索引的最佳方法是什么?

有理论上的最小压缩吗?

你知道我可以用什么方法来代替这个吗?

任何输入表示赞赏。

示例数据

笔记

  • 索引的使用将仅用于重建数据集,而不用于任何其他查询。
0 投票
2 回答
166 浏览

python - Julia 与 Python 中的位打包性能

这个问题(Parallelize code which is doing bit-wise operation)得到了一个非常好的答案和非常高效的代码,我只能与 C 代码匹配。这促使我尝试至少匹配 Julia 中的 Python 代码。

以下是用 0.64 秒和 C 代码 0.27 秒将位打包成无符号整数的 Python 代码。

以下是与 Julia 的表现相匹配的各种失败尝试:

输出:

不同的方法需要 3 到 6 秒。不确定如何提高性能以至少匹配 Python / Numba

0 投票
2 回答
277 浏览

rust - 将字节打包到 u32 与将它们存储在 vec 之间的性能差异?

介绍:

我很好奇将小数字存储为位压缩无符号整数与字节向量的性能差异(cpu 和内存使用)

例子

我将使用存储 RGBA 值的示例。它们是 4 字节,因此很容易将它们存储为u32.
但是,将它们存储为类型的向量会更具可读性u8


作为更详细的示例,假设我想存储和检索颜色 rgba(255,0,0,255)

这就是我将如何去做这两种方法:

然后可以查询两个红色值

问题 1

据我所知, 的值v必须存储在堆上,因此存在与之相关的性能成本。这些成本是否足以使钻头包装物有所值?

问题2

然后是两个表达式i >> 24and &v[0]。我不知道 rust 在位移和从堆中获取值的速度有多快。我会对其进行测试,但我暂时无法使用安装了 rust 的机器。有人可以就这两个操作的缺点提供任何直接的见解吗?

问题 3

最后,内存使用的差异是否简单到只在堆栈上存储 32 位与在堆栈上u32存储 64 位作为指针v以及在堆上存储 32 位的值v

对不起,如果这个问题有点令人困惑

0 投票
1 回答
75 浏览

matlab - 从 MATLAB 中的 64 位字段中解压缩 16 位整数值

我正在从加速度计读取数据,该加速度计将 3 个轴(x、y 和 z)中的每一个的测量值作为 16 位整数打包到一个 64 位字段中。

我在 C 中有以下代码来提取这 3 个轴值:

但现在我需要将此代码转换为 MATLAB。如何在 MATLAB 中编写这些位操作操作?

0 投票
1 回答
106 浏览

python - 如何使用 numba 优化 numpy.packbits?

我正在尝试优化numpy.packbits

它看起来比 . 慢 2 - 2.5 倍np.packbits(X)numpy这在内部是如何实现的?这可以改进numba吗?

我通过. numpy == 1.21.2_ 我的平台是:numba == 0.53.1conda install

在此处输入图像描述

结果:

在此处输入图像描述

更新

Jérôme 的回应是:

用法:

结果:

在此处输入图像描述

0 投票
0 回答
26 浏览

x86 - 常见的 x86_64 处理器行 mmx 命令中是否有用于字节的位(解)打包指令?

死灰烬! 背景: 也许你知道 mmx 打包/解包指令集,如何处理字节和更大的卷,如短裤、单词等。

问题: 对于任何 x86_64 处理器,是否有任何指令可以进行类似的打包/解包,但仅针对位?

目的: 这是一个优化DES/AES位移的想法,但如果你有其他的建议,你也可以回答。

非常感谢您的回答