Мне дан случайный инициализированный двумерный массив символов размером 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(' ');
}
}
}
Буду рад помощи! Заранее спасибо.