Как объединить по крупицам в c? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть матрица «1» и «0» с размерами 8x8.Мне нужно хранить всю матрицу в одной переменной без знака long long по битам.Как я могу это сделать?

Например, возьмем матрицу '1' и '0', равную 2x2: Матрица 2x2:

1 0
0 1

Переменная должна содержать: 1001в битах.Тот же пример, но поверх матрицы 8x8 и беззнаковой длинной переменной long.

Вот что я пытался сделать:

#include <stdio.h>

int main()
{
  unsigned long long result = 0;
  char matrix[8][8]; // lets that the matrix is already filled by '1' and '0'
  for (i=0; i<SIZE; i++)
   {
     for (j=0; j<SIZE; j++)
      {
        result = result | ((unsigned long long)(matrix[i][j] - '0'));
        result <<= 1;
      }
   }
   return 0;
}

Это правильно?Я реализовал этот вложенный цикл в своем алгоритме, и он не работал должным образом.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

попробуйте

const int mx_size = 8;


int main() {
    unsigned long long result = 0;

    bool  matrix[8][8]; // lets that the matrix is already filled by '1' and '0'
    for (int i =0; i < mx_size; ++i)
        matrix[i][i] = 1;

    for (int i = 0; i < mx_size; i++) {
        for (int j = 0; j < mx_size; j++) {         
            result |= (unsigned long long)matrix[i][j] << (i*mx_size + j);
        }
    }

    return 0;
}
0 голосов
/ 30 мая 2018

Здесь у вас есть код (чуть больше

#include <stdio.h>
#include <stdint.h>

uint64_t convert(char matrix[8][8], int order, char zero)
{
    uint8_t byte;
    uint64_t result = 0;
    for(size_t row = 0; row < 8; row++)
    {
        byte = 0;
        for(size_t column = 0; column < 8; column++)
        {
            byte <<= 1;
            byte |= matrix[row][column] != zero ? 1 : 0; //anything != defined zero char is 1
        }
        if (order)
        {
            result |= (uint64_t)byte << (8 * row);
        }
        else
        {
            result |= (uint64_t)byte << (56 - 8 * row);
        }
    }
    return result;
}

int main(void) {
    char matrix[8][8] = 
    {
        {'1','0','1','0','1','0','1','0'},
        {'0','1','0','1','0','1','0','1'},
        {'1','1','1','0','0','0','1','1'},
        {'0','0','0','1','1','1','0','0'},
        {'1','1','1','1','1','0','0','0'},
        {'0','0','0','0','1','1','1','1'},
        {'1','1','0','0','1','1','0','0'},
        {'0','0','1','1','0','0','1','1'},
    };

    unsigned long long result = convert(matrix, 0, '0');

    for(size_t index = 0; index < 64; index ++)
        printf("%1d", !!(result & (1ULL << index)));
    printf("\n");
    result = convert(matrix,1, '0');
    for(size_t index = 0; index < 64; index ++)
        printf("%1d", !!(result & (1ULL << index)));
    printf("\n");

    return 0;
}
0 голосов
/ 30 мая 2018

Преобразование текстового представления целого числа в его целочисленное значение можно выполнить с помощью strtoull().

char buf[sizeof(matrix)+1];
memcpy(buf, matrix, sizeof(matrix));
buf[sizeof(matrix)] = '\0';
result = strtoull(buf, NULL, 2);
...