PRELOADER

不念过去 不负现在 不畏将来

当前文章 : 《左移右移,循环移》

12/4/2018 —— 

题目: 同学在做移位器,用VHDL代码写。所以提示我想出了今天的编程题。
可以实现左移,右移n位,或者循环左移循环右移。

例如,输入12345,左移1位的结果为23450;右移一位的结果为01234;循环左移的结果为23451;循环右移的结果为51234.

这里是VHDL实现移位器的部分代码

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.循环左移

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.循环右移

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位

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两个辅助变量,以实现同样的输出语句,左移右移都可以执行。