将复杂的条件从C转换为Fortran

时间:2017-11-24 04:35:36

标签: 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.

1 个答案:

答案 0 :(得分:1)

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

您不能像在C

中那样将整数表达式放入Fortran中的if条件
integer :: n, b

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

是不可能的。条件必须是logical表达式。

如果对于整数表达式的任何非零值都应该为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

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