Изменить ширину целого числа со знаком на нестандартную ширину

Для сетевого приложения мне нужно подписанное целое число с дополнением 2. С пользовательской шириной. Указывается во время выполнения. Предполагая, что значение целого числа падает в ширину.

Проблема у меня есть бит четности. Есть ли способ избежать необходимости вручную устанавливать бит четности? Скажем, у меня есть целое число с шириной 11 бит, я буду хранить его в массиве из 2 символов, например:

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

0

Решение

Это не работает так. Это не может работать, потому что вы копируете два байта с начала 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
0

Другие решения

С помощью множества постов выше, я придумала это решение:

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;
}

Он вернет уменьшенное значение int с нулями в качестве заполнения.

0

По вопросам рекламы [email protected]