我是 Fortran 2008 的新手,正在尝试实施阿特金筛。在 C++ 中,我使用 a 实现了这一点,std::bitset
但在 Fortran 2008 中找不到任何用于此目的的东西。
任何人都可以指出任何示例代码或解释其中的实施策略吗?
我是 Fortran 2008 的新手,正在尝试实施阿特金筛。在 C++ 中,我使用 a 实现了这一点,std::bitset
但在 Fortran 2008 中找不到任何用于此目的的东西。
任何人都可以指出任何示例代码或解释其中的实施策略吗?
标准 Fortran 没有我所理解的精确模拟std:bitset
——尽管我承认我的理解可能有缺陷。一般来说,如果你想坚持标准的 Fortran,你会使用整数作为位集。如果一个整数没有足够的位数来满足您的目的,请使用整数数组。不过,这确实意味着,跟踪你的 bitset 的第 307 位在哪里的责任落在了你身上
在 2008 标准之前,您可以使用诸如bit_size
、iand
、和其他函数(请参阅编译器文档或 Google 以获取语言参考,或尝试英特尔 Fortran 文档)进行位操作。ibset
btest
如果您不熟悉 Fortran 的boz
文字,请熟悉它们。例如,您可以使用如下语句设置整数的位
integer :: mybits
...
mybits = b'00000011000000100000000000001111'
使用 ,b edit descriptor
您也可以读取和写入二进制文字。例如语句
write(*,*) mybits
write(*,'(b32.32)') mybits
将产生输出
50462735
00000011000000100000000000001111
如果您可以使用足够现代的编译器,那么您会发现 2008 年标准添加了新的位旋转函数,例如、bge
、bgt
等等。这些是为整数数组或整数的输入参数定义的,但我没有任何使用它们传递的经验。dshiftl
iall
这应该足以让你开始。
Fortran 具有用于操作默认整数位的位内在函数。位数组很容易构建...
确定您需要多少位,除以默认整数中的位数,如果除法的模数不为零,则分配一个默认类型的整数数组,该数组的大小与您计算的 +1 相同,并且您基本上完成了。Metcalf 和 Reid 很好地介绍了位内在函数。
您可能想要的可能如下所示:
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