我打算在数组元素的可能值上写一个do循环。更具体地说,我有一个数组,比如A(:)
,大小为n,数组A
的任何元素都可以是0
或1
。我想迭代A
元素的所有可能值。当然,一个简单的方法是
do A(1)=0, 1
do A(2)=0, 1
....
! do something with array A
end do
end do
但我的数组大小很大,这种方法不太合适。有更好的方法吗?
答案 0 :(得分:0)
由于这只是二进制,为什么不(错误)使用整数来执行此任务?只需为每个组合将整数递增1,然后使用btest
:
program test
implicit none
integer, parameter :: n = 3
integer :: i
integer :: A(n)
integer :: idx(n) = [(i, i=0,n-1)] ! bit positions start at zero
! Use a loop to increment the integer
do i=0,2**n-1
! Get the bits at the lowest positions and map true to "1" and false to "0"
A = merge( 1, 0, btest( i, idx ) )
print *,A
enddo
end program
这个简单的代码用A
填充所有组合(一次一个)并连续打印它们。
./a.out
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
请注意,Fortran只有signed integers,因此最高位在此处不可用。如果从零开始,这将使({默认)4字节整数达到2^(32-1)
组合(数组长度最多为31)。
要获得全范围,请按以下方式进行循环:
do i=-huge(1)-1,huge(1)
这为长度为32的数组提供了完整的2^32
个不同变体。