如何将水平矩阵变为垂直?
How to turn a horizontal matrix vertical?
我正在将基于输入字符的特定十六进制数转换为十进制数,然后再转换为二进制数。我正在尝试以输入字符的形状打印 1 和 0 的矩阵。当我打印第一个字符时,它横向输出。我怎样才能把它变成垂直的?
我试图找到一种方法来仅在一行列上打印每个二进制文件的第一个数字,在第二行列上打印第二个数字,依此类推,但一无所获。该代码需要使用包含所有十六进制的外部文件。从文件中提取时,A 的十六进制为十进制形式:126、17、17、17、126。然后我将它们转换为二进制整数:01111110、00010001、00010001、00010001 和 01111110。并将它们打印出来一个 5x7 矩阵。它应该产生一个垂直的 A,而不是产生一个水平的 A。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "font5x7.h"
void DecToBin (int newBin[], char userMessage[], int k) {
int i = 0;
int j = 0;
int m = 0;
for (i = 0; i < 1; ++i) {
while (m < 8) {
newBin[j] = Font5x7[k] % 2;
Font5x7[k] = Font5x7[k] / 2;
++j;
++m;
}
}
}
int main (void) {
const int INPUT_STR_SIZE = 40;
char userMessage[INPUT_STR_SIZE];
int i = 0;
int j = 0;
int k = 0;
const int BIN_MAX = 8;
int binNum[BIN_MAX];
printf("Enter message:\n");
fgets(userMessage, INPUT_STR_SIZE, stdin);
//Iterate through DecToBin function for bin equivalents
for (i = 0; i < strlen(userMessage); ++i) {
if (userMessage[i] == 'A') {
for (k = 165; k < 170; ++k) {
DecToBin(binNum, userMessage, k);
for (j = 7; j >= 0; --j) {
printf("%d", binNum[j]);
}
printf("\n");
}
}
}
return 0;
}
如果我很好地理解像素为 126、17、17、17、126 的水平 A :
01111110
00010001
00010001
00010001
01111110
必须产生一个垂直的 A 向左转(这里缺少 0 不存在):
01110
10001
10001
10001
11111
10001
10001
00000
意思是:(高位是数组中的索引,位排序越低)
07 06 05 04 03 02 01 00
17 16 15 14 13 12 11 10
27 26 25 24 23 22 21 20
...
n7 n6 n5 n4 n3 n2 n1 n0
必须生产
00 10 20 30 .. n0
01 11 21 31 .. n1
02 12 22 32 .. n2
...
07 17 27 37 .. n7
建议这样做:
#include <stdio.h>
#include <string.h>
void turnLeft(const unsigned char * v, unsigned char r[8], size_t sz)
{
memset(r, 0, sizeof(r));
size_t j = 0;
for (unsigned m = 1; m != (1 << 8); m <<= 1) {
for (size_t i = 0; (i != sz) && (i != 8); ++i) {
if (v[i] & m)
r[j] |= (1 << (7 - i));
}
j += 1;
}
}
void pr(const unsigned char * v, size_t sz)
{
for (size_t i = 0; i != sz; ++i) {
unsigned char c = v[i];
for (unsigned m = (1 << 7); m != 0; m >>= 1)
putchar('0' + ((c & m) != 0));
putchar('\n');
}
}
int main()
{
const unsigned char v[] = { 126, 17, 17, 17, 126 };
unsigned char r[8];
pr(v, sizeof(v));
putchar('\n');
turnLeft(v, r, sizeof(v));
pr(r, 8);
}
编译与执行:
vxl15036 /tmp % gcc -std=c99 -pedantic -Wextra a.c
vxl15036 /tmp % ./a.out
01111110
00010001
00010001
00010001
01111110
01110000
10001000
10001000
10001000
11111000
10001000
10001000
00000000
我正在将基于输入字符的特定十六进制数转换为十进制数,然后再转换为二进制数。我正在尝试以输入字符的形状打印 1 和 0 的矩阵。当我打印第一个字符时,它横向输出。我怎样才能把它变成垂直的?
我试图找到一种方法来仅在一行列上打印每个二进制文件的第一个数字,在第二行列上打印第二个数字,依此类推,但一无所获。该代码需要使用包含所有十六进制的外部文件。从文件中提取时,A 的十六进制为十进制形式:126、17、17、17、126。然后我将它们转换为二进制整数:01111110、00010001、00010001、00010001 和 01111110。并将它们打印出来一个 5x7 矩阵。它应该产生一个垂直的 A,而不是产生一个水平的 A。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "font5x7.h"
void DecToBin (int newBin[], char userMessage[], int k) {
int i = 0;
int j = 0;
int m = 0;
for (i = 0; i < 1; ++i) {
while (m < 8) {
newBin[j] = Font5x7[k] % 2;
Font5x7[k] = Font5x7[k] / 2;
++j;
++m;
}
}
}
int main (void) {
const int INPUT_STR_SIZE = 40;
char userMessage[INPUT_STR_SIZE];
int i = 0;
int j = 0;
int k = 0;
const int BIN_MAX = 8;
int binNum[BIN_MAX];
printf("Enter message:\n");
fgets(userMessage, INPUT_STR_SIZE, stdin);
//Iterate through DecToBin function for bin equivalents
for (i = 0; i < strlen(userMessage); ++i) {
if (userMessage[i] == 'A') {
for (k = 165; k < 170; ++k) {
DecToBin(binNum, userMessage, k);
for (j = 7; j >= 0; --j) {
printf("%d", binNum[j]);
}
printf("\n");
}
}
}
return 0;
}
如果我很好地理解像素为 126、17、17、17、126 的水平 A :
01111110
00010001
00010001
00010001
01111110
必须产生一个垂直的 A 向左转(这里缺少 0 不存在):
01110
10001
10001
10001
11111
10001
10001
00000
意思是:(高位是数组中的索引,位排序越低)
07 06 05 04 03 02 01 00
17 16 15 14 13 12 11 10
27 26 25 24 23 22 21 20
...
n7 n6 n5 n4 n3 n2 n1 n0
必须生产
00 10 20 30 .. n0
01 11 21 31 .. n1
02 12 22 32 .. n2
...
07 17 27 37 .. n7
建议这样做:
#include <stdio.h>
#include <string.h>
void turnLeft(const unsigned char * v, unsigned char r[8], size_t sz)
{
memset(r, 0, sizeof(r));
size_t j = 0;
for (unsigned m = 1; m != (1 << 8); m <<= 1) {
for (size_t i = 0; (i != sz) && (i != 8); ++i) {
if (v[i] & m)
r[j] |= (1 << (7 - i));
}
j += 1;
}
}
void pr(const unsigned char * v, size_t sz)
{
for (size_t i = 0; i != sz; ++i) {
unsigned char c = v[i];
for (unsigned m = (1 << 7); m != 0; m >>= 1)
putchar('0' + ((c & m) != 0));
putchar('\n');
}
}
int main()
{
const unsigned char v[] = { 126, 17, 17, 17, 126 };
unsigned char r[8];
pr(v, sizeof(v));
putchar('\n');
turnLeft(v, r, sizeof(v));
pr(r, 8);
}
编译与执行:
vxl15036 /tmp % gcc -std=c99 -pedantic -Wextra a.c
vxl15036 /tmp % ./a.out
01111110
00010001
00010001
00010001
01111110
01110000
10001000
10001000
10001000
11111000
10001000
10001000
00000000