问题标签 [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 投票
1 回答
351 浏览

c - Optimizing Matrix multiplication in C with Bit Packing

I'm currently attempting to write an algorithm for optimizing matrix multiplication over GF(2) using bit-packing. Both matrices A and B are provided in column major order so I start by copying A into row-major order and then packing the values into 8-bit integers and using parity checking to speed up operations. I need to be able to test square matrices of up to 2048x2048, however, my current implementation provides the correct answer up to 24x24 and then fails to compute the correct result. Any help would be appreciated.

0 投票
1 回答
120 浏览

c - 切换编译器和 IDE 后,在 C 中位打包结构时出现语法错误

好吧,我错过了什么......

我最初在 IAR IDE/编译器上编写了代码,用于 ARM 微处理器,它运行良好。

我们现在正在切换到带有 Tricore 微处理器的不同控制器,并且现在正在使用 code::blocks IDE 和用于 TriCore v3.4.6 的 GNU GCC 编译器。

构建时,我收到以下两个结构的错误(相关枚举供参考):

错误是:

但是... 在许多其他情况下,包括同一文件中的一些之前和之后,我使用相同的语法而没有错误,因此我对出了什么问题感到困惑。例如

如果我没记错的话,我在本网站的其他地方读到的是结构位打包在编译器之间不是很一致,因为它没有明确/严格地由 c 标准定义。我还读到,使用带有掩码和偏移量的按位运算是一种更跨平台友好的方式来进行位打包和失败任何其他我能做到的事情......但我想知道为什么这仅在这两个实例中不起作用我希望有一些简单的小事可以让我不必这样做。

感谢大家花时间阅读本文。

0 投票
0 回答
171 浏览

c++ - 对 enum 和 typedef 结构进行正确的位打包

我正在尝试进行一些位打包以尽可能以小格式传输数据,但我不确定如何存档它,我从一个 typedef 结构开始,我在其中为每个元素指定了大小,但是当我尝试使用传输它时UART,在另一端,我将它作为每个元素的一个字节接收

对于上面的代码,我将数据发送为:

十六进制:[1][1][6][32]

二进制:00000001 00000001 00000110 00100000

我的真正意图是收到这样的东西:

[8][4C][40]

二进制:00001 00001 00110 0 0100000 0

0 投票
3 回答
640 浏览

c - 位域更加优化

我正在为 16 位微处理器编写一些代码。我的内存非常有限,只有 128 KB。MSP430 的 IAR C/C++ 编译器 我需要实现一些代码来节省一些内存。

我试图用这个 C 特性实现来实现它。

但有了这段代码,我仍然只使用 16 位字的 1 位。

我的目标是为两个 8 位变量使用相同字长的内存位。第一个变量应该在第二个变量的左边 8 位。

这可能吗?是否有任何实现,或者 C 中是否有为此的库?我该怎么做呢?

0 投票
1 回答
503 浏览

c - 从比特流中提取 10 位字

我需要从原始比特流中提取所有 10 位字,其构建为ABACABACABAC...

它已经适用于天真的 C 实现,例如

但是性能对于我的应用程序来说是不够的,所以我想使用一些 AVX2 优化来改进它。

我访问了网站https://software.intel.com/sites/landingpage/IntrinsicsGuide/#以找到任何可以提供帮助的功能,但似乎没有什么可用于 10 位字,只有 8 位或 16 位。这似乎是合乎逻辑的,因为 10 位不是处理器原生的,但这对我来说很困难。

有没有办法使用AVX2来解决这个问题?

0 投票
1 回答
175 浏览

bit-manipulation - 是否有标准,如何以大端方式打包非字节对齐的位?

我有一个n字节的存储空间(在我的情况下是QByteArrayQt,但我认为这个问题更普遍)。

我有一个类可以对该存储进行操作,并在该位字段的任何位位置存储不同类型的数据类型。它以大端或小端顺序执行此操作,具体取决于参数。

到目前为止,没有出现任何问题。我通过这种构造的位字段在 can 总线上交换数据。不,我正在实现以位为单位存储任意长度的值(只要它们适合)。

这对于小端值很容易,因为我可以简单地修剪前导零,当涉及到负数时也可以修剪前导零。

但是,当我考虑如何正确处理大端值时,我有点困惑如何正确打包这些值。

例如,假设我有位存储0bXXXXXXXXXXXXXXXX并且我想将值存储0x0123在位 offset 4,占用 9 位:

在 little endian 中,我只是将结果0b100100011写入我的存储:0bXXX100100011XXXX

在大端,我最终得到了 value 0x2301。打包该值的正确方法是我在第一个非零字节(从右侧)中修剪零以适合 9 位吗?

因此,这将导致0x47最终的存储布局为0bXXX001000111XXXX.

这是正确的方法吗?

提前致谢。

0 投票
2 回答
384 浏览

python - Python:将二维二进制值数组打包到 UINT64 数组中的最快方法

我有一个大小为(149797, 64)的 2D UINT8 numpy 数组。每个元素都是 0 或 1。我想将每一行中的这些二进制值打包成一个UINT64值,以便我得到一个形状为 149797 的 UINT64 数组。我使用 numpy bitpack 函数尝试了以下代码。

packbits 函数执行大约需要10 毫秒。这个数组本身的简单 整形似乎需要大约7 毫秒。我还尝试使用移位操作迭代 2d numpy 数组以达到相同的结果;但速度没有提高。

最后,我还想使用numba for CPU 编译它。

使用njit大约需要6 毫秒

这是并行njit版本

3.24ms的执行时间(google colab dual core 2.2Ghz)略好一些目前,带有swapbytes(Paul's)方法的 python 解决方案似乎是最好的,即1.74 ms

我们怎样才能进一步加快这种转换?是否有使用任何矢量化(或并行化)、位数组等来实现加速的空间?

参考:numpy packbits 打包到 uint16 数组

12 核机器上(Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz),

Pauls 方法:1595.0微秒(我想它不使用多核)

Numba 代码:146.0微秒(前面提到的 parallel-numba)

即大约 10 倍的加速!

0 投票
2 回答
157 浏览

c - 将 64 个布尔数组打包/解包到 uint64

我遇到过这个答案

但是我遇到了 2 个问题,我不确定如何将其调整为打包 64 位(见下文),而且我无法解开它们。

这是我要打包的东西:

编辑:这是我迄今为止所拥有的,就像一个魅力一样,我愿意接受关于性能改进的建议:

0 投票
0 回答
188 浏览

go - 如何在 Golang 中使用位打包将结构编码为二进制

我正在尝试将大型数据结构编码为二进制。我为每个结构元素指定了位数。所以我需要根据位长将结构编码为二进制。标准 Golang 库编码/二进制将每个项目最小打包为一个字节。因此我需要另一种解决方案。如何在 Go 中将 struct 元素编码为指定的位数?

例如; Item1 = 00001101 Item2 = 00000110 结果为 01101110

0 投票
1 回答
131 浏览

python - 在python中打包字符串的正确方法

将 5 字节 asci 字符串打包到 python 中的正确方法是什么,使其为 8 字节和小端序?例如,类似:

或者:

正确(或最简单)的方法是什么?理想情况下,类似:

但似乎我不能传递一个列表或做变量解包,我必须为每个字符做一个新的位置参数。


我能想到的最好的方法如下,但我希望有更好的方法来做到这一点:


更新:似乎这可能是最好的方法:

不确定所有不同的 'char'-ish 类型:s, b, 和c来自struct页面。