비트별 논리 연산자
비트별 논리 연산자 (Bitwise logical operators)
-fdec 플래그로 논리 연산자의 타입 제약을 완화해 정수 피연산자에 대해 비트별 연산을 하도록 하는 확장을 다뤄요.
본문
-fdec를 쓰면 GNU Fortran은 논리 연산자의 타입 제약을 완화해서 정수 피연산자를 허용하고, 대신에 해당 하는 **비트별 연산(bitwise operation)**을 수행해요. 이 플래그는 호환성 전용이라 새 코드에서는 피하는 게 좋아요.
다음 코드를 생각해 볼게요.
INTEGER :: i, j
i = z'33'
j = z'cc'
print *, i .AND. j
이 예시에서 -fdec로 컴파일하면 GNU Fortran은 .AND. 연산을 내장 함수 IAND(비트별 논리곱) 호출로 바꿔서, i와 j의 비트별 and 결과를 내요.
이 변환은 피연산자 중 하나 이상이 정수 타입일 때 일어난다는 점을 주의하세요. 그래서 논리 연산에서 다른 피연산자가 정수라면, 논리 피연산자가 정수로 변환돼요. 이 경우 .TRUE.는 1로, .FALSE.는 0으로 바뀌어요.
-fdec에서 논리 연산자와 비트별 내장 함수의 대응 관계는 다음과 같아요.
| 연산자 | 내장 함수 | 비트별 연산 |
|---|---|---|
.NOT. |
NOT |
보수(complement) |
.AND. |
IAND |
교집합(intersection) |
.OR. |
IOR |
합집합(union) |
.NEQV. |
IEOR |
배타적 논리합(exclusive or) |
.EQV. |
NOT IEOR |
배타적 논리합의 보수 |
즉 .EQV.는 .NEQV.의 반대, 곧 IEOR 결과를 뒤집은 값이에요. 옛 DEC 코드에서 정수 피연산자에 논리 연산자를 쓰던 관행을 그대로 따라가기 위한 매핑이에요.
이 확장이 필요한 상황은 주로 옛 DEC 포트란 소스를 그대로 이식할 때예요. 그런 코드는 정수 값을 비트 필드로 다루면서 .AND. 같은 논리 연산자를 직접 쓰는 경우가 많았거든요. 새로 작성하는 코드라면 -fdec보다는 IAND·IOR 같은 비트별 내장 함수를 명시적으로 호출하는 쪽이 더 읽기 좋고 표준에도 가까워요.
더 알아보기
- IAND·IOR·IEOR·NOT 내장 함수
- -fdec 플래그와 DEC 확장
- BOZ 리터럴 상수