2016-05-14 11 views
0

申し訳ありませんが、これは愚かな質問ですが、私は以下のif文の実際の意味を知りたいだけです。2の累乗で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の累乗である場合ならnumprocs = 16numprocs - 1 = 15およびそれらの、そのバイナリ表現は、ビットたとえば1

で正確に1ビットを含むことになると減算で借入するLSBから起こるため、ゼロとなりますnumprocs 2のパワーが正でない場合、値のビットは、そのバイナリ表現は、そのビット1

である複数のビットを含むことになる、1

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

反対であります210

たとえば、numprocs = 20,numprocs - 1 = 19の場合、減算での借用は最上位ビットに達する前に停止するため、値が1のビットは存続し、結果はゼロになりません。

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

結果はintです。 if Cの文は、ゼロを偽とし、非ゼロを真とみなします。

関連する問題