按位 |在二维数组 C

bitwise | in a 2d-array C

好久没用C了

我有一个二维数组,其中每个元素是 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]) {

您必须遍历该行的所有列以检查是否存在 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 列。当然,您也可以使用 ceil(column_count)/64 64 位整数将其推断为超过 64 列。在这种情况下,按位或每一列来检查累积结果是否仍然非零。

很简单,只需遍历整行并找出

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