很抱歉,如果这是一个愚蠢的问题,但我只想知道下面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?
感谢。
答案 0 :(得分:2)
&
运算符是按位AND运算符。
如果numprocs
是2的幂,则其二进制表示将包含其位为1的正好一位。
例如,如果numprocs = 16
,numprocs - 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)
结果是int
。 C中的if
语句将零视为假,非零视为真。