배열 요소의 가능한 값에 대해 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
하지만 내 배열의 크기가 크고이 방법은 그다지 적합하지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?
이것은 바이너리 전용이므로이 작업에 정수를 잘못 사용하지 않는 이유는 무엇입니까? 각 조합에 대해 정수를 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에는 부호있는 정수만 있으므로 여기서는 가장 높은 비트를 사용할 수 없습니다. 2^(32-1)
여기에 표시된대로 0부터 시작하면 (기본값) 4 바이트 정수에 대한 조합 이 가능합니다 (배열 길이 최대 31).
전체 범위를 얻으려면 다음 방법으로 루프를 수행하십시오.
do i=-huge(1)-1,huge(1)
이것은 2^32
길이가 32 인 배열에 대해 완전히 다른 변형을 제공합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다