如何在Modern Fortran中实现位数组?

时间:2013-01-03 17:09:13

标签: fortran bit-manipulation hpc

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

任何人都可以指出任何示例代码或解释一个实现策略吗?

2 个答案:

答案 0 :(得分:3)

标准Fortran没有我所理解的std:bitset的精确类比 - 尽管我授予您的理解可能有缺陷。通常,如果您想坚持使用标准Fortran,则可以使用整数作为位集。如果一个整数没有足够的位用于您的目的,请使用整数数组。但这确实意味着,跟踪你的bitset的第307位的责任落在你身上

在2008标准之前,您拥有bit_sizeiandibsetbtest等功能(请参阅编译器文档或Google以获取语言参考,或者尝试the Intel Fortran documentation)进行位操作。

如果您不熟悉Fortran的boz文字,那么请熟悉它们。例如,您可以使用诸如此

之类的语句设置整数的位
integer :: mybits
...
mybits = b'00000011000000100000000000001111'

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

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

将产生输出

    50462735
00000011000000100000000000001111

如果你能够掌握足够现代的编译器,那么你会发现2008标准添加了新的比特功能,例如bgebgtdshiftl,{ {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