2016-05-15 83 views
0

我很長一段時間沒有使用過C語言。按位|在二維數組中C

我有一個2d數組,其中每個元素是1或0.我想知道每行是否有1或不。我這樣做:

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); 
    } 
} 

我用錯了嗎?

schemaArray是我的參數列表參數:

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

編譯器告訴你,你正在使用自'如果是錯誤的(| schemaArray [行] == 1)'情況不會編譯。但它不會告訴你如何正確使用它。 –

回答

2

您將有超過行的所有列的迭代,以檢查是否存在1

示例代碼:

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); 
} 

,除非你構建的schemaArray位圖這不能使用位運算符來完成。在這種情況下,您可以一次檢查整行。

這主要是一個矯枉過正。只有當你的代碼片段對性能至關重要時才這樣做。

預處理步驟:構建一個位圖陣列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; 
} 

在你的函數,然後你可以使用位圖:

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

不過,在大多數,你將能夠有假設我們使用64位整數數組,則在2-D陣列中有64列。當然,你也可以通過使用64位整數來推斷64位以上的列。在這種情況下,按位或每列檢查累積結果是否仍然不爲零。

2

簡單只是遍歷整個行,並找出

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