关于按位与 &和按位或 | 的程序

本程序将一个给定汉字的点阵逆时针旋转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......
FDFCxxxxxx.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. FE44xxxxxxx..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.....
E810xxx.x......x.... 17FF...x.xxxxxxxxxxx
4890.x..x...x..x.... F120xxxx...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]);
 }
 }

 

 

 

有红色的表注的小弟不会,请各位大哥指教,谢谢了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值