2016-05-14 53 views
0

對不起,如果這是一個愚蠢的問題,但我只是想知道下面if語句的實際含義是什麼。檢查MPI中兩個電源的進程數

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型?

謝謝。

回答

2

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

如果numprocs是2的冪,它的二進制表示將僅包含一個位,其位是1

例如,如果numprocs = 16numprocs - 1 = 15和他們的,將是零,因爲在減法借用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語句將把零視爲假並且非零爲真。