如何获取元素为零或一的数组的所有变体

How to obtain all variations of an array with elements being zero or one

我将对数组元素的可能值编写一个 do 循环。更具体地说,我有一个数组,比如大小为 n 的 A(:),数组 A 的任何元素都可以是 01。我想遍历 A 元素的所有可能值。当然一个简单的方法是

do A(1)=0, 1
 do A(2)=0, 1
  ....
   ! do something with array A

 end do 
end do 

但是我的数组很大,这种方法不是很合适。有更好的方法吗?

既然这只是二进制,为什么不(错误地)使用整数来完成这项任务?只需为每个组合将整数递增 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,所以这里不能使用最高位。如果您从零开始(数组长度最大为 31),那么(默认)4 字节整数的组合最多为 2^(32-1)

要获得完整范围,请按以下方式进行循环:

  do i=-huge(1)-1,huge(1)

这为长度为 32 的数组提供了完整的 2^32 不同变体。