This question already has answers here:
Closed 3 years ago.
How to check if a number is a power of 2
(22个答案)
抱歉,如果这是一个愚蠢的问题,但我只想知道下面的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的幂,但它实际上是如何工作的?语句的输出是什么?是布尔型还是int型?
谢谢。

最佳答案

&运算符是按位与运算符。
如果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)

结果是intifC中的语句将0视为false,非0视为true。

09-27 02:17