【位操作】【经典位运算考题】汉字点阵左转90度【经典永流传】【位运算】

汉字点阵左转90度程序(TurnLeft90.java)说明:
这个实例程序是根据1991年计算机软件考试程序员级的C语言考题改写而来,基本保持了原试题的精华和风格。很遗憾,我把原题给弄丢了。如有网友遇见,敬请贴出来。
出题者可能怕泄露程序设计思路,在题目说明时遮遮掩掩,实际只告知了程序输出结果(如下图)和程序的功能:汉字点阵左转90度。这个试题应当是软考开考以来历年程序设计题(所有级别)中最难的。程序用一个数组(数据类型:C语言中的unsigned;Java语言没有unsigned,用short)表示一个汉字的点阵,比特位(bit)为1或0,0表示空白。考题原共设置了6个填空,其中一个填空(用整数是否非零,进行条件判断)仅与C语言特点有关,改写成java程序后剩下5个填空。
这个程序主要用于观摩学习,算法原理我尚未分析出来,我怀疑是否与图像处理中的仿射变换类似。

程序的测试效果示意图:
在这里插入图片描述
上图是程序执行结果。本例程的精华在于turnLeft()方法和display()方法:
turnLeft()方法仅仅使用了for循环嵌套,循环体中仅用一句代码就实现了汉字点阵向左旋转90度,确实高明至极;
display()方法显示汉字点阵也类似,太高明了,简直巧夺天工。

**试题代码说明:**下面代码中的【】表示程序的空缺部分,需要答题者填充完成。(由软考试题改变而成)从C语言改变为Java语言。

**代码说明:**下面代码中的【】表示程序的空缺部分,需要答题者填充完成。
public class TurnLeft90 {  //汉字点阵左转90度,示例程序 begin
	short[] source = { 0X1040,0X1040,0X1048,(short)0XFDFC,0X2040,
			0X2844,0X4BFE,0X7C80,0X0888,0X09FC,
			0X1C08,(short)0XE810,0X4890,0X0860,0X0820,0X0810 }; 
	short[] target = new short[16];
	
	public void prnCharArray(char[] str) {
		for (char c : str) System.out.print(c);
	}
	
	public void turnLeft() { //左转90度
		int k;
		for (int row = 0; row < source.length; row++) {
			for ( k = 0, 【                       】 ; k < 16; k++) 
				target[row] |= ( (source[k]>>【        】&1)<<【       】 );
		}
	}
	
	public void display() {  //打印显示方法
		char[][] out = { new char[16],new char[16] }; 
		char[] letter =  {'○','●'};  //{'.','*'};    // {'○','●'};
		int iLeft = 0, iRight = 1;
		
		for (int row = 0; row < source.length; row++) {
			for (int col = 0; col < 16; col++) {
				out[iLeft][col] = letter[ 【                                  】&1];
				out[iRight][col] = letter[ 【                                    】&1];
			}
			System.out.printf("\n%6x\t", source[row]);
			prnCharArray(out[iLeft]);

			System.out.printf("%6x\t", target[row]);
			prnCharArray(out[iRight]);
		}
	}
	
	public static void main(String[] args) {
		TurnLeft90 word = new TurnLeft90();
		word.turnLeft();
		word.display();
	}
}  

下面是完整的程序源代码(含答案):

/***位运算试题:汉字点阵左转90度***/
/***
 * @author QiuGen
 * @description  汉字点阵左转90度例程TurnLeft90
 * 实现功能:汉字点阵左转90度(由软考试题改变而成)
 * @date 2024/5/20
 * ***/
public class TurnLeft90 {
	short[] source = { 0X1040,0X1040,0X1048,(short)0XFDFC,0X2040,
			0X2844,0X4BFE,0X7C80,0X0888,0X09FC,
			0X1C08,(short)0XE810,0X4890,0X0860,0X0820,0X0810 }; 
	short[] target = new short[16];
	
	public void prnCharArray(char[] str) {
		for (char c : str) System.out.print(c);
	}
	
	public void turnLeft() { //左转90度
		int k;
		for (int row = 0; row < source.length; row++) {
			for ( k = 0, target[row]=0 ; k < 16; k++) 
				target[row] |= ( (source[k]>>row&1)<<15-k );
		}
	}
	
	public void display() {  //打印显示方法
		char[][] out = { new char[16],new char[16] }; 
		char[] letter =  {'○','●'};  //{'.','*'};    // {'○','●'};
		int iLeft = 0, iRight = 1;
		
		for (int row = 0; row < source.length; row++) {
			for (int col = 0; col < 16; col++) {
				out[iLeft][col] = letter[(source[row]>>(15-col))&1];
				out[iRight][col] = letter[(target[row]>>(15-col))&1];
			}
			System.out.printf("\n%6x\t", source[row]);
			prnCharArray(out[iLeft]);

			System.out.printf("%6x\t", target[row]);
			prnCharArray(out[iRight]);
		}
	}
	
	public static void main(String[] args) {
		TurnLeft90 word = new TurnLeft90();
		word.turnLeft();
		word.display();
	}
}

测试实际效果图(显示有点变形):
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#提供了许多位操作运算符,它们可以用于对二进制位进行操作,这些运算符包括: 1. 按位与(&):将两个操作数的每一位进行与运算,如果对应位都为1,则结果为1,否则为0。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a & b; // c 的值为 00000001,即 1 ``` 2. 按位或(|):将两个操作数的每一位进行或运算,如果对应位都为0,则结果为0,否则为1。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a | b; // c 的值为 00000111,即 7 ``` 3. 按位异或(^):将两个操作数的每一位进行异或运算,如果对应位相同,则结果为0,否则为1。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = 3; // 二进制表示为 00000011 int c = a ^ b; // c 的值为 00000110,即 6 ``` 4. 按位取反(~):将操作数的每一位进行取反运算,即0变成1,1变成0。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = ~a; // b 的值为 11111010,即 -6(注意这里是有符号的整数) ``` 5. 移(<<):将操作数的所有位向移动指定的位数,右侧用0填充。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = a << 2; // b 的值为 00010100,即 20 ``` 6. 右移(>>):将操作数的所有位向右移动指定的位数,侧用符号位填充(即如果操作数是正数,则侧用0填充,如果是负数,则侧用1填充)。 示例代码: ``` int a = 5; // 二进制表示为 00000101 int b = a >> 2; // b 的值为 00000001,即 1 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值