2016-04-26 5 views
0

配列インデックスの各ビットに16ビットの値を保持する配列を持っています。私がしたいことは、特定の配列要素の "ビット単位の"排他的論理和(XOR)を実行し、次にすべての要素を1つずつ(折り返しながら)シフトすることです。特に配列のXORとシフトビット

、Iは、アレイ素子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に返すということですが、これは発生しませんし、私はその理由を把握することはできません。私は自分のコードで見落とされている、小さくて明白なものだと感じますが、わかりません。あなたがループ条件用としてj == 0条件を打つことは決してありませんシフト部で

+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、および次のようになるはずである必要があります:代わりにXOR演算はこのように見えるんあなたの文の

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

皮肉なことに、あなたのstate_array[15]は、正しかったです固定する必要があるのは23、および5です。

さらに、forループの条件は、j>=0で、j>0でなければなりません。

+0

このリンクは一時的ですが、証明:http://cpp.sh/7uq5y – FCo

1

j > 0

+0

どのように私はラップを得るようにループを変更できますか?つまりインデックス15は0にラップする必要があります。 – Noobgineer

+0

forループの条件を 'j> = 0'に変更するだけです。 else節は 'j == 0 'の場合には実行されないので、範囲外にならないように安全でなければなりません。 –

+0

ちょうどそれを試み、0001010101101100に私の出力を変更しました。異なる結果が、まだ正しくありません。 – Noobgineer

関連する問題