如何在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再左移,这会引发两个问题:- 最后一次循环后会多执行一次左移,丢失最后一位并多出一个无效的0位;
- 最终二进制位的顺序会和预期的矩阵顺序错位。
比如你给出的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; }
逻辑说明
- 遍历顺序:采用行优先遍历(从第一行第一个元素到最后一行最后一个元素),矩阵的第一个元素对应结果的最高位,最后一个元素对应最低位,完全匹配你给出的2×2示例逻辑。
- 移位与赋值顺序:先左移
result腾出位置,再把当前位写入最低位,确保每一位都被正确添加,不会出现丢位或多移位的问题。 - 类型转换:将
matrix[i][j] - '0'转为unsigned long long是为了避免位运算时的类型提升问题,确保操作在64位无符号整数范围内进行。
如果需要调整位的对应顺序(比如把矩阵最后一个元素作为最高位),只需要反转循环的遍历方向(比如i从7到0,j从7到0)即可。
内容的提问来源于stack exchange,提问作者Asm .
相关产品推荐
相关产品推荐

