如何在c中逐位连接?

时间:2018-05-30 19:24:36

标签: c string matrix bit-manipulation bits

我有' 1'和' 0'尺寸为8x8。我需要将整个矩阵逐位存储在一个无符号长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 :(得分:2)

可以使用strtoull()将整数的文本表示转换为整数值。

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

答案 1 :(得分:1)

试试这个

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;
}

答案 2 :(得分:0)

这里有代码(多一点

#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;
}