我是Fortran 2008的新手,正在尝试实施Atkin的Sieve。在C ++中,我使用std::bitset
实现了这一点,但是在Fortran 2008中找不到任何用于此目的的东西。
任何人都可以指出任何示例代码或解释一个实现策略吗?
答案 0 :(得分:3)
标准Fortran没有我所理解的std:bitset
的精确类比 - 尽管我授予您的理解可能有缺陷。通常,如果您想坚持使用标准Fortran,则可以使用整数作为位集。如果一个整数没有足够的位用于您的目的,请使用整数数组。但这确实意味着,跟踪你的bitset的第307位的责任落在你身上
在2008标准之前,您拥有bit_size
,iand
,ibset
,btest
等功能(请参阅编译器文档或Google以获取语言参考,或者尝试the Intel Fortran documentation)进行位操作。
如果您不熟悉Fortran的boz
文字,那么请熟悉它们。例如,您可以使用诸如此
integer :: mybits
...
mybits = b'00000011000000100000000000001111'
使用b edit descriptor
,您也可以读写二进制文字。例如语句
write(*,*) mybits
write(*,'(b32.32)') mybits
将产生输出
50462735
00000011000000100000000000001111
如果你能够掌握足够现代的编译器,那么你会发现2008标准添加了新的比特功能,例如bge
,bgt
,dshiftl
,{ {1}}还有更多。这些是为整数数组或整数的输入参数定义的,但我没有任何使用它们传递的经验。
这应该足以让你入门。
答案 1 :(得分:-1)
您可能想要的样子:
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