2

我是 Fortran 2008 的新手,正在尝试实施阿特金筛。在 C++ 中,我使用 a 实现了这一点,std::bitset但在 Fortran 2008 中找不到任何用于此目的的东西。

任何人都可以指出任何示例代码或解释其中的实施策略吗?

4

3 回答 3

3

标准 Fortran 没有我所理解的精确模拟std:bitset——尽管我承认我的理解可能有缺陷。一般来说,如果你想坚持标准的 Fortran,你会使用整数作为位集。如果一个整数没有足够的位数来满足您的目的,请使用整数数组。不过,这确实意味着,跟踪你的 bitset 的第 307 位在哪里的责任落在了你身上

在 2008 标准之前,您可以使用诸如bit_sizeiand、和其他函数(请参阅编译器文档或 Google 以获取语言参考,或尝试英特尔 Fortran 文档)进行位操作。ibsetbtest

如果您不熟悉 Fortran 的boz文字,请熟悉它们。例如,您可以使用如下语句设置整数的位

integer :: mybits
...
mybits = b'00000011000000100000000000001111'

使用 ,b edit descriptor您也可以读取和写入二进制文字。例如语句

write(*,*) mybits
write(*,'(b32.32)') mybits

将产生输出

    50462735
00000011000000100000000000001111

如果您可以使用足够现代的编译器,那么您会发现 2008 年标准添加了新的位旋转函数,例如、bgebgt等等。这些是为整数数组或整数的输入参数定义的,但我没有任何使用它们传递的经验。dshiftliall

这应该足以让你开始。

于 2013-01-03T17:32:52.453 回答
0

Fortran 具有用于操作默认整数位的位内在函数。位数组很容易构建...

确定您需要多少位,除以默认整数中的位数,如果除法的模数不为零,则分配一个默认类型的整数数组,该数组的大小与您计算的 +1 相同,并且您基本上完成了。Metcalf 和 Reid 很好地介绍了位内在函数。

于 2015-04-30T02:12:17.520 回答
-2

您可能想要的可能如下所示:

program test
logical,allocatable:: flips(:)
...
allocate(flips(ntris),status=err)
call tris(ntris,...,flips)
...
end
subroutine tris(nnewtris, ...,flips)
logical flips(nnewtris)
...
if(flips(i)) then
...
end if
return
end
于 2018-02-12T14:06:34.617 回答