左移右移,循环移

题目: 同学在做移位器,用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
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();

}

//1号 若为右移则执行1,2号
while(m<0)
{
System.out.print("0 ");
m++;
x++;
}
//2号
for(int j=x;j<n-m;j++)
{
System.out.print(a[z+m]+" ");
z++;
}
//3号 若为左移则执行2,3号
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两个辅助变量,以实现同样的输出语句,左移右移都可以执行。