This question already has answers here:
Closed 3 years ago.
How to check if a number is a power of 2
(22个答案)
抱歉,如果这是一个愚蠢的问题,但我只想知道下面的if语句的实际含义。
我被告知“numprocs&(numprocs-1)”用于检查numprocs是否是2的幂,但它实际上是如何工作的?语句的输出是什么?是布尔型还是int型?
谢谢。
相反,如果
例如,如果在到达最高位之前,
结果是
(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 = 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
。if
C中的语句将0视为false,非0视为true。09-27 02:17