我是Fortran 2008的新手,正在尝试实现Atkin的筛子。在C++中,我使用std::bitset实现了这一点,但在Fortran2008中找不到任何用于此目的的东西。
有没有人可以给我一些示例代码或者解释一下其中一个的实现策略?
发布于 2013-01-04 01:32:52
Standard Fortran没有我所理解的std:bitset的精确类比--尽管我承认我的理解可能是有缺陷的。一般来说,如果你想坚持使用标准的Fortran,你可以使用整数作为位集。如果一个整数的位数不足以满足您的需要,请使用整数数组。这确实意味着,跟踪比特集中的第307位的责任落在了您身上。
在2008标准之前,您可以使用bit_size、iand、ibset、btest等函数进行位操作(请参阅您的编译器文档或谷歌获取语言参考,或尝试使用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、iall等等。它们是为整数数组或整数的输入参数定义的,但我没有任何使用它们传递的经验。
这应该足以让您入门了。
发布于 2015-04-30 10:12:18
Fortran具有用于操作缺省整数位的位内部函数。位数组很容易在此基础上构建……
确定需要多少位,除以缺省整数中的位数,分配一个默认大小的整数数组,如果除法的模非零,则分配+1的大小,基本上就完成了。Metcalf和Reid中很好地介绍了bit的本质。
发布于 2018-02-12 22:06:35
您需要的内容可能如下所示:
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
endhttps://stackoverflow.com/questions/14143677
复制相似问题