Побитовое целочисленное конкатенация

Для некоторого фона я пытаюсь написать систему для передачи пакетов целых чисел с целью построения лабиринта с использованием логического переключателя, чтобы решить, должны ли два узла иметь стену между ними, в настоящее время мой лабиринт обрабатывает 480 стен, поэтому я не надеваю Я не хочу отправлять пакет с одним элементом, а скорее разделить его на массив целых чисел (длина 8), что дает мне 480/8 объектов для отправки.

const int wallRows = mazeSize / 8;
int temp = NULL;
int temp2 = NULL;
int current = NULL;
int concatCount = 0;
int* walls = new int[wallRows];
int wallIndex = 0;

for (int i = 0; i < mazeSize; i++) {
current = temp2;
//ensure my ints have only 8 bytes
if (concatCount >= 7) {
//allocate a full int to the array
walls[wallIndex] = temp;
//clear the int
temp = NULL;
//move to the next array pos
wallIndex++;
//restart the int count
concatCount = 0;
}
if (maze->allEdges[i]._iswall) {
//append a 1 to the int
temp = 0b1;
}
else {
//append a 0 to the int
temp = 0b0;
}
//increment the int count
current = (temp2 << 1) | temp;
concatCount++;
}

Это то, что я сейчас построил, моя идея состояла в том, чтобы начать с int, передать ему int, основанное на возврате bool «_isWall», и сдвинуть результат в конец int.
Когда целое число достигнет емкости, перейдите к следующему целому в массиве и начните снова, пока стены лабиринта не заполнят массив.

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

0

Решение

использование val | (1UL << temp2), и не temp2 << 1 установить биты. Позже вы можете использовать поразрядно & оператор, чтобы увидеть, установлен ли бит. Вы должны инициализировать весь байт до нуля и устанавливать бит только в том случае, если значение равно true. Вот пример:

int main(void)
{
//assign random values for testing
int wallinfo[480];
for(int i = 0; i < 480; i++)
wallinfo[i] = !!(rand() % 2);

//copy to the values to compress
unsigned char compress[60] = { 0 };
for(int i = 0; i < 60; i++)
for(int j = 0; j < 8; j++)
if(wallinfo[i * 8 + j])
compress[i] |= 1UL << j;

//decompress to get back wallinfo
int decompress[480];
for(int i = 0; i < 60; i++)
for(int j = 0; j < 8; j++)
decompress[i * 8 + j] = !!(compress[i] & (1UL << j));

//wallinfo should match decompress
if(memcmp(wallinfo, decompress, 480) == 0)
printf("success\n");
else
printf("failed\n");

return 0;
}
1

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector