标签: bit-packing

比特打包结构中的数组

我想在一个位打包的结构中有一个数组.我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位.例如,我希望能够说出类似的话:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));
Run Code Online (Sandbox Code Playgroud)

我尝试了几件事,但是gcc不会让步.能够这样做是很好的,这样我就可以编写遍历打包数组中元素的干净代码.想法?

c gcc bit-packing

4
推荐指数
1
解决办法
1759
查看次数

如何在Python中打包任意位序列?

我想将一些二进制图像数据编码/压缩为序列(如果是位).(通常,此序列的长度不能完全适合整数个标准整数类型.)

如何在不浪费空间的情况下做到这一点?(我意识到,除非比特序列具有"漂亮"的长度,否则在最后总是必须有少量[<1字节]的剩余空间.)

FWIW,我估计,对于我想要编码的每个符号,最多需要3位.Python有这种工作的内置工具吗?

python memory bit-packing

4
推荐指数
1
解决办法
6596
查看次数

C#相当于python的struct.pack

是否有C#,允许类似的功能Python的库struct标准库

可以使用真实对齐的结构非常接近地模拟结构库.但我还没有找到任何方法来直接控制C#结构中的endianess(C#的结构似乎更倾向于COM互操作,而不是更倾向于通用二进制包装).

c# binary struct bit-packing

3
推荐指数
1
解决办法
1963
查看次数

如何在CUDA中打包(有效)?

我有一个字节数组,其中每个字节都是0或1.现在我想将这些值打包成位,这样8个原始字节占用1个目标字节,原始字节0进入位0,字节1进入位1,到目前为止,我在内核中有以下内容:

const uint16_t tid = threadIdx.x;
__shared__ uint8_t packing[cBlockSize];

// ... Computation of the original bytes in packing[tid]
__syncthreads();

if ((tid & 4) == 0)
{
    packing[tid] |= packing[tid | 4] << 4;
}
if ((tid & 6) == 0)
{
    packing[tid] |= packing[tid | 2] << 2;
}
if ((tid & 7) == 0)
{
    pOutput[(tid + blockDim.x*blockIdx.x)>>3] = packing[tid] | (packing[tid | 1] << 1);
}
Run Code Online (Sandbox Code Playgroud)

这是正确有效的吗?

c++ parallel-processing cuda bit-packing

2
推荐指数
1
解决办法
811
查看次数

如何用char数组打包短整数的位字段?

在以下2个结构中,

typedef struct _a {
    short a1:13 __attribute__((packed));
    char a2[4]  __attribute__((packed));
} a;

typedef struct _b {
    short b1:10 __attribute__((packed));
    short b2:10 __attribute__((packed));
    short b3:12 __attribute__((packed));
} b;
Run Code Online (Sandbox Code Playgroud)

struct b,我发现b2的位用b1打包,b3的位用b2打包.它最终导致4字节值.

我期待类似的行为,struct a但我看不出相同.前2个字节用a1(未使用的5位)占用,后跟4个字节用于a2.

这种行为有望吗?为什么我不能将char [4]与短片一起包装:13?有没有办法实现它?

c bit-packing bit-fields

1
推荐指数
1
解决办法
1210
查看次数

从比特流中提取10位字

我需要从原始比特流中提取所有10位单词 ABACABACABAC...

它已经可以与天真的C实现一起使用,例如

for(uint8_t *ptr = in_packet; ptr < max; ptr += 5){
    const uint64_t val =
        (((uint64_t)(*(ptr + 4))) << 32) |
        (((uint64_t)(*(ptr + 3))) << 24) |
        (((uint64_t)(*(ptr + 2))) << 16) |
        (((uint64_t)(*(ptr + 1))) <<  8) |
        (((uint64_t)(*(ptr + 0))) <<  0) ;

    *a_ptr++ = (val >>  0);
    *b_ptr++ = (val >> 10);
    *a_ptr++ = (val >> 20);
    *c_ptr++ = (val >> 30);
}
Run Code Online (Sandbox Code Playgroud)

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

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

有什么方法可以使用AVX2解决此问题?

c optimization simd bit-packing avx2

1
推荐指数
1
解决办法
174
查看次数

将字节打包到 u32 与将它们存储在 vec&lt;u8&gt; 中的性能差异?

介绍:

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

例子

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


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

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

// Bitpacked:
let i: u32 = 4278190335;
//binary is 11111111 00000000 00000000 11111111
//In reality I would most likely do something more similar to:
let i: u32 = 255 << 24 + 255; //i think this syntax is right

// Vector:
let v: Vec<u8> = [255,0,0,255];
Run Code Online (Sandbox Code Playgroud)

然后可以查询这两个红色值

i >> 24 
//or
&v[0]
//both expressions evaluate to 255 (i think. I'm really new to …
Run Code Online (Sandbox Code Playgroud)

bit-packing rust

1
推荐指数
1
解决办法
70
查看次数

结构位填充和LSB/MSB歧义C++

我必须为以下数据包头写一个c ++代码:

原始图片链接,上面JPEG的PNG版本.

这是我为上面的数据包格式编写的结构代码.我想知道uint8_t或uint16_t位字段是否正确

    struct TelemetryTransferFramePrimaryHeader
    {
        //-- 6 Ocets Long --//

        //-- Master Channel ID (2 octets)--//
        uint16_t TransferFrameVersionNumber : 2;
        uint16_t SpacecraftID : 10;
        uint16_t VirtualChannelID : 3;
        uint16_t OCFFlag : 1;

        //-----------------//

        uint8_t MasterChannelFrameCount;
        uint8_t VirtualChannelFrameCount;

        //-- Transfer Frame Data Field Status (2 octets) --//

        uint16_t TransferFrameSecondaryHeaderFlag : 1;
        uint16_t SyncFlag : 1;
        uint16_t PacketOrderFlag : 1;
        uint16_t SegmentLengthID : 2;
        uint16_t FirstHeaderPointer : 11;

        //-----------------//

    };
Run Code Online (Sandbox Code Playgroud)

如何确保在结构中保留LSB - > MSB?

我一直很困惑,我已经尝试过阅读,但最终让我更加困惑.

PS:我使用的是32位处理器.

c c++ embedded struct bit-packing

0
推荐指数
1
解决办法
1459
查看次数