Для сетевого приложения мне нужно подписанное целое число с дополнением 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;
}
Он вернет уменьшенное значение int с нулями в качестве заполнения.