Fortran 函数判断一个整数是否为 2 的幂

Adr*_*ian 3 fortran

我正在尝试在 Fortran 中编写一个函数,它将最终确定一个整数是否是 2 的幂。此代码在 2^28 范围内有效,但在 2^29 范围内失败:

 real(kind(1.q0)) elemental function fractional_part(x)
 real(kind(1.q0)), intent(in) :: x
 fractional_part = x-floor(x)
 end function fractional_part

 program frac
 implicit none

 real(kind(1.q0)) :: fractional_part
 integer :: ii
 logical :: pof2

 read(5,*) ii
 pof2 = (fractional_part(log(real(ii,16))/log(2.q0)) == 0.0q0)
 if(pof2) write(6,*) ii

 end
Run Code Online (Sandbox Code Playgroud)

不幸的是,它依赖于整数到实数(16)的转换以及势必有噪声的对数函数。

las*_*nce 7

如果您的输入为非负数,您可以使用 popcnt() 来计算位数。

program test
   integer i
   do i = 1, 2 ** 30
      if ( popcnt(i) == 1 ) print *, i
   end do
end program test
Run Code Online (Sandbox Code Playgroud)