将复杂条件从 C 转换为 Fortran

标签 c fortran gfortran

我有一个小的 C 函数来转换 Fortran

baralign(n, b)  {   

  return ((n&~(~0<<b)) ? (n&(~0<<b))+(1<<b):(n))

}

我将上述语句中的条件用 Fortran 语言编写如下

if (IAND(n,NOT(ISHFT(NOT(0),b))))

我不确定这个情况。当我运行此代码时,出现错误:

IF clause requires a scalar LOGICAL expression.

最佳答案

该问题与问题 Implicit conversion integer <--> logical in Fortran if statement 相关,但是这个问题略有不同,因为提问者知道问题的本质。

您不能像在 C 中那样将整数表达式放入 Fortran 中的 if 条件中

integer :: n, b

if (IAND(n,NOT(ISHFT(NOT(0),b))))

不可能。条件必须是逻辑表达式。

如果对于整数表达式的任何非零值都应该为 true,那么您必须在那里进行整数比较

if (IAND(n,NOT(ISHFT(NOT(0),b))) /= 0) then

如果您要求表达式恰好为 1,则可以使用 == 1 代替。

剩下的可能是

  baralign = IAND(n,ISHFT(NOT(0),b)) + ISHFT(1, b)
else
  baralign = n
end if

但我不知道代码的用途,所以我无法确定。

关于将复杂条件从 C 转换为 Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47466426/

相关文章:

c - 生成原始比特流作为输出以在另一个软件中进行管道传输

c - 在 Ubuntu 中运行,在 Debian 中运行 SegFault(C,strtok)

fortran - 如何在 Fortran 中以固定格式打印极小的 double 字?

r - R 包调用的 Fortran 代码仅在 Linux 上导致段错误崩溃

c - 在 L1 缓存 : only getting 62% 中获取 Haswell 上的峰值带宽

java - 组播发送性能

python - Fortran 或 C 和 f2py 求解微分方程

c - ISO_C_绑定(bind) : Impact on performance/optimization

fortran - gfortran 找不到那里的库

fortran - 去除字符串中的空格