2014-03-28 95 views
0

我正在編寫java中的SDES密碼,正在將兩個長度爲5的數組向左移動一個空間,這對於p10kleft變爲shiftp10kleft變得很好,但是當我將相同的代碼應用於p10kright以成爲shiftp10kright,它將在末尾添加一個隨機1而不是將第一個0移到最後一位。將數組元素左移到java中

該處是我的代碼:

package ciphers; 
import java.io.*; 
import java.lang.reflect.Array; 
import java.util.Arrays; 
import java.util.Collections; 

public class SDESNew { 

    public static void main(String []arg)throws Exception 
    { 
     int[] k = {1,1,1,1,0,1,1,0,0,0}; 
     int[] P10 = {3,5,2,7,4,10,1,9,8,6}; 
     int[] P8 = {6,3,7,4,8,5,10,9}; 
     int[] P4 = {2,4,3,1}; 
     int[] IP = {2,6,3,1,4,8,5,7}; 
     int[] EP = {4,1,2,3,2,3,4,1}; 
     int S0[][] = { 
         {1,0,3,2}, 
         {3,2,1,0}, 
         {0,2,1,3}, 
         {3,1,3,2} 
        }; 

     int S1[][] = { 
         {0,1,2,3}, 
         {2,0,1,3}, 
         {3,0,1,2}, 
         {2,1,0,3} 
        }; 

     //Arrays that we have to calculate 
     int p10k[]=new int[10]; //Create p10(k) array 
     int[] p10kleft = new int[5]; 
     int[] p10kright = new int[5]; 
     int[] shiftp10kleft = new int[5]; 
     int[] shiftp10kright = new int[5]; 



     for(int i=0;i<10;i++) 
     { 
      System.out.println("Value from array P10: " +P10[i]);       //Printing values from array P10 
      System.out.println("Array position to be used in array k: "  +(P10[i]-1)); //Array position begins at 0 so subtracting 1 from P10 position so array begins at 0 
      System.out.println(k[P10[i]-1]); //Printing values in array positions 
      p10k[i]=k[P10[i]-1]; //Putting array values in p10k array 
      System.out.println(""); 
     } 
     System.out.println("P10k: " +Arrays.toString(p10k)); //Printing out all values in p10k array 

     System.arraycopy(p10k, 0, p10kleft, 0, p10kleft.length); 
     System.arraycopy(p10k, p10kleft.length, p10kright, 0, p10kright.length); 

     System.out.println("Left: " +Arrays.toString(p10kleft)); 
     System.out.println("Right: " +Arrays.toString(p10kright)); 



     // System.arraycopy(p10kleft, 1, shiftp10kleft, 0, p10kleft.length - 1); 

     int n = p10kleft.length; 
     shiftp10kleft = p10kleft; 
     int i = 0; 
     if (n>0) 
     { 
      for(i=0; i<n-1; i++) 
      { 
       p10kleft[i]=p10kleft[i+1]; 
      } 
     } 
     p10kleft[i] = shiftp10kleft[i]; 


     System.out.println("Shift Left: " +Arrays.toString(shiftp10kleft)); 




     n = p10kright.length; 
     shiftp10kright = p10kright; 
     i = 0; 
     if (n>0) 
     { 
      for(i=0; i<n-1; i++) 
      { 
       p10kright[i]=p10kright[i+1]; 
      } 
     } 
     p10kright[i] = shiftp10kright[i]; 


     System.out.println("Shift Right: " +Arrays.toString(shiftp10kright)); 


     } 

     } 

這裏是電流輸出:

Value from array P10: 3 
Array position to be used in array k: 2 
1 

Value from array P10: 5 
Array position to be used in array k: 4 
0 

Value from array P10: 2 
Array position to be used in array k: 1 
1 

Value from array P10: 7 
Array position to be used in array k: 6 
1 

Value from array P10: 4 
Array position to be used in array k: 3 
1 

Value from array P10: 10 
Array position to be used in array k: 9 
0 

Value from array P10: 1 
Array position to be used in array k: 0 
1 

Value from array P10: 9 
Array position to be used in array k: 8 
0 

Value from array P10: 8 
Array position to be used in array k: 7 
0 

Value from array P10: 6 
Array position to be used in array k: 5 
1 

P10k: [1, 0, 1, 1, 1, 0, 1, 0, 0, 1] 

Left: [1, 0, 1, 1, 1] 

Right: [0, 1, 0, 0, 1] 

Shift Left: [0, 1, 1, 1, 1] 

Shift Right: [1, 0, 0, 1, 1] 

我需要右移正確輸出[1,0,0,1,0]

+0

你爲什麼使用數組?這看起來像是一種非常C++的做事方式,這並不像它看起來移植到Java那樣容易。您可以更輕鬆地使用C-y方式並在例如'long',或者採用Java-y方式並將它們包裝在自己的界面中。 – blgt

+0

我更喜歡這種方法,但我只是困惑,爲什麼我用來生成p10kleft相同的代碼不能以相同的方式生成p10kright – user3332742

+0

它看起來像我'p10kleft [i] = shiftp10kleft [i];'應改爲閱讀'p10kleft [i] = shiftp10kleft [0];'。我不完全清楚你的代碼是幹什麼的,所以我可能是錯的。無論哪種情況,都應該考慮至少使用'Arrays.copyOfRange()'而不是自己做。 – blgt

回答

0

如在註釋中那樣,在進入循環之前將第一個值存儲在基元中:

 int n = p10kleft.length; 
    shiftp10kleft = p10kleft; 
    int i = 0; 
    int first = p10kleft[i]; 
    if (n>0) 
    { 
     for(i=0; i<n-1; i++) 
     { 
      p10kleft[i]=p10kleft[i+1]; 
     } 
    } 
    p10kleft[i] = first; 

關於你提到的其他問題,重複此操作3次是明顯的(而不是特別聰明,或者有效的方式)來做到這一點:

for(int shiftCounter = 0; shiftCounter < 3; shiftCounter++) { 
    int n = p10kleft.length; 
    ... 
    p10kleft[i] = first; 
} 

在任何情況下,有一些更好的方法正如我已經建議的那樣。但是,如果你在陣列上死了,你至少可以使用System.arraycopy。一個簡單的例子是:

static int[] shiftLeft(int[] arr, int shift) { 
    int[] tmp = new int[arr.length]; 
    System.arraycopy(arr, shift, tmp, 0, arr.length-shift); 
    System.arraycopy(arr, 0, tmp, arr.length-shift, shift); 
    return tmp; 
} 

,然後用它是這樣的:

p10kleft = shiftLeft(p10kleft, 1); // shift once 
p10kleft = shiftLeft(p10kleft, 3); // shift 3 times 

編輯:修正參數順序arraycopy