2016-04-26 35 views
0

我有一個數組,它包含一個數組索引中每個位的16位值。我想要做的是執行特定數組元素的「按位」XOR,然後將所有元素移過1(包裝)。XOR和移位數組中的位

特別地,我想在陣列元件2,3使用XOR,和5最後一個元素,16

此代碼被認爲是循環的,使得一旦它已經完成了特定數目的週期(65535),它應該返回到原始輸入值。

這裏是我的代碼:

#include <iostream> 
using namespace std; 

void main() 
{ 
    //Initial array input 
    int state_array[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }; 
    int temp[1] = { 0 }; 

    int array_size = sizeof(state_array)/(sizeof(temp[0])); 

    for (int i = 0; i<65535; i++) 
    { 
     temp[0] = state_array[15]; 

     //XOR Values 
     for (int j = 0; j<16; j++) { 
      if ((j == 2 || j == 3 || j == 5) && state_array[15] == 1) { 
       state_array[j] = !state_array[j]; 
      } 
     } 

     //Shift values 
     for (int j = array_size-1; j>0; j--) 
     { 
      if (j == 0) { 
       state_array[0] = temp[0]; 
      } 
      else { 
       state_array[j] = state_array[j-1]; 
      } 
     } 
    } 
} 

希望發生的事情是,經過65535次迭代,數組返回到值0000000000000001,但這種情況不會發生,我無法找出原因。我覺得這是我在代碼中忽略的一個小小的,顯而易見的事情,但我無法弄清楚。

+0

程序輸出0001011111110010.我在XOR和移位後打印結果,看起來移位有問題,但我不是100%確定的。 – Noobgineer

回答

1

的問題是,你不正確索引。而不是你的說法,它的異或看起來像這樣:

if ((j == 2 || j == 3 || j == 5) && state_array[15] == 1) { 
    state_array[j] = !state_array[j]; 
} 

它需要0索引,而不是1,並應該是這樣的:

if ((j == 1 || j == 2 || j == 4) && state_array[15] == 1) { 
    state_array[j] = !state_array[j]; 
} 

諷刺的是,你的state_array[15]是正確的,這只是需要修復的2,35

此外,您的for循環應具有條件j>=0而不僅僅是j>0

+0

這個鏈接是暫時的,但證明:http://cpp.sh/7uq5y – FCo

1

在轉變部分中,您將永遠不會打j == 0條件爲您的循環條件是j > 0

+0

那麼,我如何更改循環,讓我包裝?即索引15應該換行到索引0. – Noobgineer

+0

你應該能夠將for循環條件改爲'j> = 0'。應該是安全的,因爲else節不會在'j == 0'情況下執行。 –

+0

剛剛嘗試過,它將輸出更改爲0001010101101100.結果不同,但仍不正確。 – Noobgineer