2016-04-26 10 views
0

Ich habe ein Array, das einen 16-Bit-Wert für jedes Bit in einem Array-Index enthält. Ich möchte ein "bitweises" XOR bestimmter Array-Elemente ausführen und dann alle Elemente um 1 verschieben (mit Wrapping).XOR- und Verschiebungsbits im Array

Insbesondere möchte ich XOR an den Array-Elementen verwenden, 2, 3 und 5 mit dem letzten Element, 16.

Dieser Code soll cyclisch sein, so dass, sobald es eine bestimmte Anzahl von Abschluss Zyklen (65535) sollte es auf den ursprünglichen Eingabewert zurückkehren.

Hier ist mein Code:

#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]; 
      } 
     } 
    } 
} 

Was passieren soll, ist, dass nach 65535 Iterationen, die Array-Wert zurückgibt zurück 0000000000000001, aber dies nicht der Fall, und ich kann nicht herausfinden, warum. Ich fühle mich wie eine kleine, offensichtliche Sache, die ich in meinem Code übersehen habe, aber ich kann es nicht herausfinden.

+0

Das Programm gibt 0001011111110010 aus. Ich habe das Ergebnis nach dem XOR und dem Schalten ausgedruckt und es scheint, dass etwas nicht stimmt, aber ich bin nicht 100% sicher. – Noobgineer

Antwort

1

Das Problem ist, dass Sie nicht richtig sind indexiert. Statt Ihre Aussage, die nicht suchen die XOR-Verknüpfung wie folgt aus:

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

es braucht 0-indiziert werden, nicht mehr als 1, und sollte wie folgt aussehen:

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

Ironischerweise Ihre state_array[15] war richtig, Es sind nur 2, 3 und 5, die behoben werden müssen.

Darüber hinaus sollte Ihre for Schleife die Bedingung j>=0 nicht nur j>0 haben.

+0

Dieser Link ist temporär, aber Beweis: http://cpp.sh/7uq5y – FCo

1

Im Shift-Abschnitt werden Sie treffen nie die j == 0 Zustand als für Schleifenbedingung ist j > 0

+0

Also wie kann ich die Schleife ändern, so dass ich einwickeln? d. h. der Index 15 sollte in den Index 0 übergehen. – Noobgineer

+0

Sie sollten nur die Bedingung für die for-Schleife in 'j> = 0 ändern können. Sollte so sicher sein, dass es nicht aus dem Rahmen fällt, da der else-Abschnitt nicht im Fall "j == 0" ausgeführt wird. –

+0

Ich habe es gerade versucht und es hat meine Ausgabe in 0001010101101100 geändert. Anderes Ergebnis, aber immer noch nicht korrekt. – Noobgineer