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

Для некоторого фона я пытаюсь написать систему для передачи пакетов целых чисел с целью построения лабиринта с использованием логического переключателя, чтобы решить, должны ли два узла иметь стену между ними, в настоящее время мой лабиринт обрабатывает 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. Когда целое число достигнет емкости, перейдите к следующему целому в массиве и начните снова, пока стены лабиринта не заполнят массив.

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

1 ответ

Использование 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;
}
Другие вопросы по тегам