题目: 同学在做移位器,用VHDL代码写。所以提示我想出了今天的编程题。 可以实现左移,右移n位,或者循环左移循环右移。
例如,输入12345,
左移1位的结果为23450
;右移一位的结果为01234
;循环左移的结果为23451
;循环右移的结果为51234
.
这里是VHDL 实现移位器的部分代码
1 2 3 4 5 6 7 8 9 10 11 begin process (a,sel) begin case sel is when shftpass => y <= a; when shtl => y <= a(14 downto 0 ) & '0' ; when shtr => y <= '0' & a(15 downto 1 ); when rotl => y <= a(14 downto 0 ) & a(15 ); when rotl => y <= a(0 ) & a(15 downto 1 ) ; when others => y <= "000000000000000" ; end case ; end process ;
下面是java的代码:
1.循环左移
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package cyclicShift;import java.util.Scanner;public class cyclicShift { public static void main (String[] args) { Scanner in = new Scanner (System.in); String a = in.next(); int flag = 0 ; do { String b = in.next(); flag = b.indexOf("." ); if (flag<0 ) { System.out.print(" " +b); } }while (flag<0 ); System.out.println(" " +a); } } 输出示例; 请输入需要循环左移的数据,每位数以空格分隔,末尾以空格加“.”结束 1 2 3 4 5 6 . 2 3 4 5 6 1
2.循环右移
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package cyclicShift;import java.util.Scanner;public class shiftRight { public static void main (String[] args) { Scanner in = new Scanner (System.in); System.out.println("请输入数位数:并回车确定" ); int n = in.nextInt(); int [] a = new int [n]; int i = 0 ; System.out.println("请输如需要循环右移的数,并回车确定" ); do { a[i]=in.nextInt(); i++; }while (i<a.length); for (int j=1 ;j<a.length;j++) { System.out.print(" " +a[j]); } System.out.println(" " +a[0 ]); } } 输出示例: 请输入数位数:并回车确定 6 请输如需要循环右移的数,并回车确定 1 2 3 4 5 6 2 3 4 5 6 1
3.左/右移n位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package cyclicShift;import java.util.Scanner;public class cyclicN {public static void main (String[] args) { Scanner in = new Scanner (System.in); System.out.println("请输入数的位数" ); int n = in.nextInt(); int [] a = new int [n]; System.out.println("请输入需要左移或右移几位。左移为正,右移为负" ); int m = in.nextInt(); System.out.println("请输入数字" ); int x=0 ; int z=0 ; for (int i = 0 ;i<n;i++) { a[i]=in.nextInt(); } while (m<0 ) { System.out.print("0 " ); m++; x++; } for (int j=x;j<n-m;j++) { System.out.print(a[z+m]+" " ); z++; } while (m>0 ) { System.out.print("0 " ); m--; } } } 输出示例: 请输入数的位数 5 请输入需要左移或右移几位。左移为正,右移为负 2 请输入数字 1 2 3 4 5 3 4 5 0 0
1、这个题目是我自己想出来的。首先想实现的结果就是可以循环左移。思路就是一次性输入完需要移动的数据,中间以空格分开,这样就可以使用in.next()
读取一个数据。将第一个读到的数据用变量存储起来,而其他的读到什么就输出什么,知道检测到.
代表输入完成,之后接着输出第一次读到的数。这样就完成了一次循环左移。
2、第二题循环右移,本可以参照第一题的方法,可是这次麻烦的是读进的数并不马上输出,因为首先要输出的是最后一次的输入。这就需要将先读入的数据存放在一个数组里。而关于数组,由于不知道要输入的数据会有多少个,如果设置一个很大的 容量的数组,若很多空位没被赋值,就会被默认设成0,这样在输出是就会造成麻烦。所以先指定了此次需要输入的数据会有几个。这样的处理,现在想来,或许可以指定一个变量,每次读到一个数据就加1,即该变量存有数据的长度这一数值,输出是更具该值做变化。
3、第三题是很神奇的一题。要做到左移右移n位,首先输入数组的长度n,输入需要移动的位数m,整数表示左移,负数表示右移。之后遍历一遍数组给每一位赋值。然后就根据m的值去判断需要左移还是右移。由于不想写if语句
,所以调整了很多次1,2,3号片段的内容,最终才能输出正确的值。
4、现在可以做到的就是,若为右移,即m<0;
,此时先输入m个0,之后进入while循环
,即2号程序,进行数组0到n-m结束的输出,此时借助辅助的变量x。而若m>0,则1号程序会跳过,执行2号程序,先输出从m到n的值,然后打印出m个0。
5、其实可以设置if语句
,将左移右移的循环语句分开执行,可是为了追求一个统一好看的输出,选择增加z,x两个辅助变量,以实现同样的输出语句,左移右移都可以执行。