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

Check number of processes in MPI for power of two

抱歉,如果这是一个愚蠢的问题,但我只想知道下面的 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 的幂,但它实际上是如何工作的?语句的输出是什么?它是布尔值还是整数?

谢谢。

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

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

例如,如果numprocs = 16numprocs - 1 = 15,它们的AND将为零,因为减法中的借位发生在从LSB到值为1的位。

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

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

例如numprocs = 20,numprocs - 1 = 19和减法借位会在到达最高位之前停止,所以值为1的位保留下来,结果不会为零。

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

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