按位|在2d阵列C中

时间:2016-05-15 17:00:56

标签: c arrays bitwise-operators

我已经很长时间没用过C.

我有一个2d数组,其中每个元素是1或0.我想知道每一行是否有1。我这样做了:

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

我使用它错了吗?

schemaArray是我的参数列表中的参数:

var ss = require("sdk/simple-storage");
var storage = ss.storage;
/* using 'storage' doesn't matter as long as you don't have identifyers collision */
storage[naming()] = new entryConstructor();
// and you still can refer to storage using ss.storage

2 个答案:

答案 0 :(得分: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列。当然,您也可以使用ceil(column_count)/64 64位整数将其推断为包含64列以上。在这种情况下,按位OR每列检查累积结果是否仍为非零。

答案 1 :(得分: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;
        }
    }
}