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

如何在现代Fortran中实现位数组?,fortran,bit-manipulation,hpc,Fortran,Bit Manipulation,Hpc,我是Fortran 2008的新手,正在尝试实现Atkin的筛选。在C++中,我使用了 STD::BITSET 实现了这个问题,但是在FORTRAN 2008中找不到任何用于这个目的的东西。p> 有人能给我指出任何示例代码或解释一个示例代码的实现策略吗?标准Fortran与我所理解的std:bitset没有精确的相似之处,尽管我承认我的理解可能有缺陷。一般来说,如果您想坚持使用标准Fortran,您可以使用整数作为位集。如果一个整数没有足够的位用于您的目的,请使用整数数组。不过,这确实意味着,跟

我是Fortran 2008的新手,正在尝试实现Atkin的筛选。在C++中,我使用了<代码> STD::BITSET 实现了这个问题,但是在FORTRAN 2008中找不到任何用于这个目的的东西。p>
有人能给我指出任何示例代码或解释一个示例代码的实现策略吗?

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

在2008标准之前,您拥有诸如
bit\u size
iand
ibset
btest
等用于位操作的函数(请参阅编译器文档或谷歌以获取语言参考,或尝试)

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

integer :: mybits
...
mybits = b'00000011000000100000000000001111'
使用
b编辑描述符
也可以读取和写入二进制文字。例如,声明

write(*,*) mybits
write(*,'(b32.32)') mybits
将产生产出

    50462735
00000011000000100000000000001111
如果你能找到一个足够现代的编译器,那么你会发现2008年的标准增加了新的位旋转功能,比如
bge
bgt
dshift
iall
等等。这些是为整数数组或整数的输入参数定义的,但我没有任何使用它们来传递的经验


这应该足以让您开始学习。

Fortran具有用于操作默认整数位的位内部函数。位阵列是直接建立在这个基础上


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

您可能想要的可能是:

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

gfortran是一个“足够现代”的编译器吗?顺便说一句,我需要为我的Sieve实现存储1000万位。我不知道,这不是我使用过的编译器,但我相信Google会帮你找到这个问题的答案。我不知道C的操作,但是Fortran程序有很好的文档记录,因此您可能可以自己确定这一点。Gfortran在实现现代内部函数方面很快(当然,使用最新版本)。例如,只需查看在线手册。您将在那里找到函数的作用。欢迎。一定要接受欢迎。所有答案都得益于一些解释,好的答案通常不仅仅包含代码。请注意,像这样的简短或仅代码的答案会被自动选择进行特别审查,因为它们被认为是潜在的不好答案,需要几个人来查看它们并确定它们是否真的不好。最好避免这种审查。