将有符号整数的宽度更改为非标准宽度

Change the width of a signed integer to a nonstandard width

对于网络应用程序,我需要一个带符号的 2 的补码整数。具有自定义宽度。在 运行 时间指定。假设整数的值落在宽度上。

我遇到的问题是奇偶校验位。有什么办法可以避免手动设置奇偶校验位?假设我有一个宽度为 11 位的整数,我会将它存储在一个包含 2 个字符的数组中,如下所示:

int myIntWidth = 11;
int32_t myInt= 5;
unsigned char charArray[2] = memcpy(charArray, &myInt, (myIntWidth + 7)/8);

不是这样的。它无法工作,因为您正在从 myInt 的开头复制两个字节,但您不知道您感兴趣的字节存储在哪里。您还需要知道存储字节的顺序。视情况而定,使用以下两个代码之一:

unsigned char charArray [2];
charArray [0] = myInt & 0xff; // Lowest 8 bits
charArray [1] = (myInt >> 8) & 0x07; // Next 3 bits

unsigned char charArray [2];
charArray [1] = myInt & 0xff; // Lowest 8 bits
charArray [0] = (myInt >> 8) & 0x07; // Next 3 bits

在上面很多帖子的帮助下,我想出了这个解决方案:

inline void reduceSignedIntWidth(int32_t& destInt, int width)
{
    //create a value mask, with 1's at the masked part
    uint32_t l_mask = (0x01u << width) - 1;

    destInt &= l_mask;
}

它将 return 简化的 int,以零作为填充。