Неожиданное поведение компилятора при использовании побитовых операторов - PullRequest
0 голосов
/ 24 октября 2019

Мне дан случайный инициализированный двумерный массив символов размером 8x8. Каждый элемент имеет значение 0 или 1, следовательно, он в основном представляет 64-битное число, где первый элемент, то есть arr [0] [0] представляет наиболее значимый бит. Проблема довольно тривиальна, все, что мне нужно сделать, это выделить сначала длинное число без знака, которое инициализируется в 0, с числом, состоящим из 1 в 64-м бите и нулями где-либо еще (в основном, «маской»), и всякий раз, когдаЯ сталкиваюсь с 1 в массиве, я должен ИЛИ два числа. (Очевидно, я продолжаю сдвигать маску на 1 бит вправо каждую итерацию). Затем мне нужно написать функцию, которая дает такое кодированное число, print - это двоичное представление, которое также является тривиальной задачей. Просто итерируйте по битам и выполните & с числом с (k-1) нулями для k-го бита. И все же по какой-то причине происходит странное поведение!

Это выходные данные программы:

11001000 00111111 10101001 00100110 10101110 11011011 10100111 11100100

18446744073709551615
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

Первая строка указывает массив, вторая - число в десятичном представлении, третья - некодированное число.

Вот код:

#define SIZE 8

typedef char board[SIZE][SIZE];

void init_board_randomly(board bn) {
    int i, j;
    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            bn[i][j] = rand() % 2 == 1 ? '1' : '0';
            putchar(bn[i][j]);
        }
        printf(" ");
    }
    printf("\n");
}

unsigned long long code_board(board bn) {
    unsigned long long code = 0;
    unsigned long long mask = 1ULL << 63;
    int i, j;
    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            if (bn[i][j]) {
                code |= mask;
            }
            mask >>= 1;
        }
    }
    printf("\n");
    return code;
}


void display_bits(unsigned long long n) {
    int i;
    char c;
    unsigned long long mask = 1ULL << 63;
    for (i = 1; i <= 64; i++) {
        c = n & mask ? '1' : '0';
        putchar(c);
        mask >>= 1;
        if (i % 8 == 0) {
            putchar(' ');
        }
    }
}

Буду рад помощи! Заранее спасибо.

...