gpt4 book ai didi

fortran - 如何使用 gfortran 处理应用于整数值的逻辑语句?

转载 作者:行者123 更新时间:2023-12-02 08:56:19 24 4
gpt4 key购买 nike

我正在重写一些代码,使程序可以使用 gfortran 编译器进行编译,而不是我通常使用的 ifort 编译器。代码如下:

_Subroutine SlideBits (WORD, BITS, ADDR) 

Implicit None
Integer(4) WORD
Integer(4) BITS
Integer(4) ADDR
Integer(4) ADDR1

ADDR1 = 32 - ADDR
WORD = (WORD .And. (.Not.ISHFT(1,ADDR1))) .Or. ISHFT(BITS,ADDR1)

End_

当我使用 gfortran 编译器编译上面的代码时,我收到这个错误:

WORD = (WORD .And. (.Not.ISHFT(1,ADDR1))) .Or. ISHFT(BITS,ADDR1) 

Error: Operand of .NOT. operator at (1) is INTEGER(4)

进入子程序的所有三个变量都是整数。我环顾四周,gfortran wiki 指出 gfortran 编译器应该能够处理应用于整数值的逻辑语句。我访问过的其他几个站点要么引用了 gnu wiki,要么同意它。这是我第一次看到这个错误,因为我通常使用的 Intel Fortran 编译器 (ifort) 编译干净。

最佳答案

上面的评论/答案“可能不是”正确的答案,这取决于您的最终目标。

“WORD = ..”语句的可能目的是 .NOT。获得 bool /逻辑结果,而是获得一种整数枚举器。

要看到这一点,首先“忽略”移位(iShift() 等),然后只看 IntR = Int1 之类的东西。诠释2。这将产生一个“正确的”整数结果。该值不仅取决于 int 的值,还取决于它们声明的“类型”(例如 Integer(1)、Integer(2) 等)

也就是说,WORD 的结果值将是一个“正确的”整数;像“33504”之类的东西 .. 或其他什么,(可能).NOT。 0/1 或 -1/0 或 .True./.False。等等

如果你替换 = Int1 .Or. Int2 with = (Int1/= 0) 或者。 (Int2/= 0) ... 你会得到一个“整数逻辑”(即 0/1 等)并且不会产生所需的枚举器 ... 如果这就是您正在寻找的。

.Or.在两个 Int 上是一种按位加法,它根据位的对齐方式/字的大小等生成新的数字。

e.g. 3 == 011, 2 = 010 ... so, 3 .Or. 2 ==> 011 = 3
e.g. 3 == 011, 5 = 101 ... so, 3 .Or. 5 ==> 111 = 7
e.g. 5 == 101, 5 = 101 ... so, 5 .Or. 5 ==> 101 = 5

...同样是.And.提供了一种乘法。

这种技术有时用于创建枚举器,有点像使用二的幂 (1,2,4,8...) 来分配一个值。然后,这些的任何总和例如,值可以分解为其组成元素。例如,如果 a(1) = 2,且 a(2) = 8,则和 10 可以分解为显示选择是 (1,2,4,8,...) 等的第一个和第四个元素。

注意到位移位就像乘以 2(左移)和除以 2(右移)可能有助于概念化这一点。

顺便说一句,您不需要为此限制为 Fortran。将其打入 VBA 函数并在电子表格中查看结果 VBA 不会有移位内在函数,但它们是可用的......在任何情况下它都会证明 Int1 .Or。 Int2 行为即使没有移位,例如

Function TwoIntsOr(Int1 As Long, Int2 As Long) As Long
'
TwoIntsOr = Int1 Or Int2
'
End Function

--.或者。在 Fortran 中

Function TwoIntsOr(Int1, Int2)
Integer :: TwoInstOr
Integer, Intent(In) :: Int1, Int2
!
TwoIntsOr = Int1 .Or. Int2
!
End Function

).

关于fortran - 如何使用 gfortran 处理应用于整数值的逻辑语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com