You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将8×8的0/1矩阵逐位拼接至unsigned long long变量?

8×8 0/1矩阵转unsigned long long的正确实现

你的代码存在几个明显问题,导致无法正常编译或得到错误结果,我来逐一拆解并给出正确的实现:

你的代码中的问题

  • 变量未声明:循环里的i和j没有提前声明,在C语言中(尤其是C89标准)这会直接导致编译错误,需要在main开头补充int i, j;。
  • SIZE未定义:代码里用了SIZE但未提前定义,要么替换成固定值8,要么添加#define SIZE 8。
  • 移位与赋值顺序错误:你当前的逻辑是先把当前位写入result再左移,这会引发两个问题:
    1. 最后一次循环后会多执行一次左移,丢失最后一位并多出一个无效的0位;
    2. 最终二进制位的顺序会和预期的矩阵顺序错位。
      比如你给出的2×2示例,用你的代码会得到10010(十进制18),而不是预期的1001(十进制9)。

正确的实现代码

#include <stdio.h>
#define SIZE 8  // 定义矩阵尺寸

int main() {
    unsigned long long result = 0;
    // 示例矩阵,可替换为实际填充的0/1矩阵
    char matrix[SIZE][SIZE] = {
        {'1','0','0','1','0','0','1','0'},
        {'0','1','0','1','1','0','0','1'},
        {'1','1','1','0','0','0','1','1'},
        {'0','0','0','1','1','1','0','0'},
        {'1','0','1','0','1','0','1','0'},
        {'0','1','0','1','0','1','0','1'},
        {'1','1','0','0','1','1','0','0'},
        {'0','0','1','1','0','0','1','1'}
    };
    int i, j;  // 声明循环变量

    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            // 先左移一位,腾出最低位的位置
            result <<= 1;
            // 将当前矩阵位(转成0或1)写入最低位
            result |= (unsigned long long)(matrix[i][j] - '0');
        }
    }

    // 可选:打印结果验证,二进制每8位分隔对应矩阵行
    printf("二进制结果(行优先顺序,高位到低位):");
    for (int k = 63; k >= 0; k--) {
        printf("%d", (result >> k) & 1);
        if (k % 8 == 0) printf(" ");
    }
    printf("\n十进制结果:%llu\n", result);

    return 0;
}

逻辑说明

  1. 遍历顺序:采用行优先遍历(从第一行第一个元素到最后一行最后一个元素),矩阵的第一个元素对应结果的最高位,最后一个元素对应最低位,完全匹配你给出的2×2示例逻辑。
  2. 移位与赋值顺序:先左移result腾出位置,再把当前位写入最低位,确保每一位都被正确添加,不会出现丢位或多移位的问题。
  3. 类型转换:将matrix[i][j] - '0'转为unsigned long long是为了避免位运算时的类型提升问题,确保操作在64位无符号整数范围内进行。

如果需要调整位的对应顺序(比如把矩阵最后一个元素作为最高位),只需要反转循环的遍历方向(比如i从7到0,j从7到0)即可。

内容的提问来源于stack exchange,提问作者Asm .

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:23:41