2016-05-15 8 views
0

Ich habe C für ziemlich lange Zeit nicht verwendet.bitweise | in einem 2d-Array C

Ich habe ein 2D-Array, wo jedes Element 1 oder 0 ist. Ich möchte für jede Zeile wissen, ob es 1 gibt oder nicht. Ich mache es so:

for (row = xa; row < 50; row++) { 
// need to know first if there is any '1' in the next line 
    if (|schemaArray[row] == 1) { 
     printf("1 found in row %d\n",row); 
    } 
} 

Bin ich es falsch?

schemaArray ist ein Argument in meiner Parameterliste:

int findPerimeter(int schemaArray[50][50]) { 
+0

Der Compiler sagt Ihnen, Sie verwenden es für falsch, da die 'if (| schemaArray [Zeile] == 1)' Zustand nicht kompilieren. Es wird Ihnen jedoch nicht sagen, wie Sie es richtig verwenden. –

Antwort

2

Sie das Iterierte über alle Spalten der Zeile müssen überprüfen, ob es eine 1 existiert.

Beispielcode:

for (int row = xa; row < 50; row++) { 
    int bIsOne = 0; 
    for (int i = 0;i < col_size && !bIsOne; i++) { 
    bIsOne = bIsOne | schemaArray[row][i]; 
    } 
    if(bIsOne) 
    printf("1 found in row %d\n",row); 
} 

Dies kann nicht mit bitweise Operatoren durchgeführt werden, wenn Sie ein Bitmap für die schemaArray konstruieren. In diesem Fall können Sie die gesamte Zeile auf einmal überprüfen.

Dies ist meist ein Overkill. Tun Sie es nur, wenn Ihr Code leistungsabhängig ist.

Vorverarbeitungsschritt: Konstruieren Sie eine Bitmap-Array für schemaArray

long long bitMapSchemaArray[ROW_SIZE]; 
for (int i = 0; i < row_count; i++) { 
    long long columnBitMap = 0; 
    for (int j = 0; j < col_count; j++) { 
    columnBitMap <<= 1; // Multiplies by 2 
    columnBitMap = columnBitMap | schemaArray[i][j]; // Add a 1 if schemaArray[i][j]=1 else 0 
    } 
    bitMapSchemaArray[i] = columnBitMap; 
} 

In Ihrer Funktion können Sie dann verwenden, um die Bitmap als:

for (int i = 0; i < row_count; i++) { 
    if(bitMapSchemaArray[i]) 
    printf("There is a 1 in %d row\n", i+1); 
} 

jedoch höchstens, werden Sie in der Lage sein zu haben 64 Spalten in 2-D Array unter der Annahme, dass wir ein Array von 64-Bit-Ganzzahlen verwenden. Natürlich können Sie dies auch extrapolieren, um mehr als 64 Spalten zu haben, indem Sie ceil(column_count)/64 64-Bit-Ganzzahlen verwenden. In diesem Fall bitweise ODER jede Spalte, um zu überprüfen, ob das kumulative Ergebnis noch nicht Null ist.

2

Einfache iterieren nur über die gesamte Reihe und finden Sie heraus

for (row = 0; row < 50; row++) { 
    for (col= 0; row < 50; col++) { 
     if (schemaArray[row][col] == 1){ 
      printf("1 found in row %d\n",row); 
      break; 
     } 
    } 
}