检查MPI中的进程数为2的幂

时间:2016-05-14 01:46:51

标签: c mpi bitwise-operators

很抱歉,如果这是一个愚蠢的问题,但我只想知道下面if语句的实际含义。

int rank, numprocs;
MPI_Status status;

MPI_Init(&argc,&argv);
MPI_Comm_size( MPI_COMM_WORLD, &numprocs );
MPI_Comm_rank( MPI_COMM_WORLD, &rank     );

if( numprocs&(numprocs-1) )
{
    if( rank==0 ) printf( "numprocs must be a power of 2.\n" );
    MPI_Finalize();
    return EXIT_FAILURE;
}

我被告知“numprocs&(numprocs-1)”用于检查numprocs是否是2的力量,但它实际上是如何工作的?声明的输出是什么?是boolean还是int?

感谢。

1 个答案:

答案 0 :(得分:2)

&运算符是按位AND运算符。

如果numprocs是2的幂,则其二进制表示将包含其位为1的正好一位。

例如,如果numprocs = 16numprocs - 1 = 15及其AND将为零,因为从LSB到值为1的位进行减法借用。

  10000 (16)
& 01111 (15)
------------
  00000 ( 0)

相反,如果numprocs为正且不是2的幂,则其二进制表示将包含多个位为1的位。

例如,如果numprocs = 20numprocs - 1 = 19并且减法中的借位将在到达最顶部位之前停止,那么其值为1的位仍然存在且结果不会为零。

  10100 (20)
& 10011 (19)
------------
  10000 (16)

结果是int。 C中的if语句将零视为假,非零视为真。