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

时间:2016-03-25 20:41:51

标签: arrays fortran do-loops

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

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

 end do 
end do 

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

1 个答案:

答案 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个不同变体。