本程序将一个给定汉字的点阵逆时针旋转90度,并输出旋转前后的点阵数据及字形。
附图是汉字"转"字的 16×16 点阵字形,用数字 '0' 表示空白位置,用数字 '1' 表示非空白位置,“转”字的第一行机即可表示成如下的{0,1}序列:
0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
如果把它看作一个字的 16 个位,“转”字的第一行可以用 16 进制数的 1040 来表示.同理,"转"字的第二行可以表示为1040 ,第三行可以表示为 1048,...等等。依次类推,用16个双字节整型数即可存放一个汉字点阵字形。"转"字的点阵数据及字形如附图的左半部分所示.将一个汉字逆时针旋转90度,就是把该汉字点阵的最右列作为旋转后点阵的第一行,次右列作为旋转后点阵的第二行,...,来形成一个旋转后的点阵字形。
附图的右半部分就是将"转"字旋转 90 度后的点阵数据和字形。
程序中,数组 old 中存放着“转”字的点阵数据.函数 turnleft 将该点阵数据逆时针旋转 90 度,旋转后的点阵数据存放在数组 new 中.函数 display 将旋转前后的点阵数据加以编辑,用字符 '.' 表示值为0的位,用字符 'x' 表示值为 1 的 位,从而将旋转前后的点阵按行输出其 16 进制数据及字形,如同图 13-3 和图 13-2 所表示的那样。
1040 | ...x.....x...... | 0000 | ................. | |
1040 | ...x.....x...... | 0200 | ......x......... | |
1048 | ...x.....x..X... | 1640 | ...x.xx..x...... | |
FDFC | xxxxxx.xxxxxxx.. | 32E0 | ..xx..x.xxx..... | |
2040 | ..x......x...... | 1259 | ...x..x..x.xx..x | |
2844 | ..x.x....x...x.. | 1246 | ....x..x...x..xx. | |
4BFE | .x..x.xxxxxxxxx. | FE44 | xxxxxxx..x...x.. | |
7C80 | .xxxxx..x....... | 13C8 | ...x..xxxx..x... | |
0888 | ....x...x...x... | 1240 | ...x..x..x...... | |
09FC | ....x..xxxxxxx.. | 0200 | ......x......... | |
0C08 | ...xxx......x... | 1120 | ...x...x..x..... | |
E810 | xxx.x......x.... | 17FF | ...x.xxxxxxxxxxx | |
4890 | .x..x...x..x.... | F120 | xxxx...x..x..... | |
0860 | ....x....xx..... | 1D10 | ...xxx.x...x.... | |
0820 | ....x.....x..... | 1318 | ...x..xx...xx... | |
0810 | ..,,x.,....x..., | 1010 | ...x.,,,...x.... | |
图 13-1 | 图 13-2 |
[程序]
#include <stdio.h>
#define EMPTY '.'
#define NONEMPTY 'X'
#define LEFT 0
#define RIGHT 1
main ()
{
static unsigned old[16]=
{ 0x1040,0x1040,0x1048,0xFDFC,0x2040,0x2844,
0x4BFE,0x7C80,0x0888,0x09FC,0x1C08,0xE810,
0x4890,0x0860,0x0820,0x0810
};
unsigned new[16];
turnleft( old, new );
display( old, new );
}
turnleft( old,new)
unsigned old[],new[];
{
int row,k;
for ( row=0; row<16; row++ )
for ( k=0, new[row] = 0 ;k<16;k++ )
new[row]|=(( old[k]>> row ) & 1) << 15-k ;
}
display( old,new )
unsigned *old,*new;
{
char out[2][17],letter[2];
int row,col;
letter[0] = EMPTY;
letter[1] = NONEMPTY;
out[LEFT][16]=out[RIGHT][16]='/0';
for ( row = 0;row<16;row++,old++,new++ )
{
for ( col = 0;col<16;++col )
{
out[LEFT][col] = letter[ ( *old >> (15-col)) &1];
out[RIGHT][col] = letter[ (*new >> (15-col)) &1];
}
printf("/n %4x %s ",*old,&out[LEFT][0]);
printf(" %4x %s",*new,&out[RIGHT][0]);
}
}
有红色的表注的小弟不会,请各位大哥指教,谢谢了