비트별 논리 연산자

비트별 논리 연산자 (Bitwise logical operators)

-fdec 플래그로 논리 연산자의 타입 제약을 완화해 정수 피연산자에 대해 비트별 연산을 하도록 하는 확장을 다뤄요.

출처: Bitwise logical operators

본문

-fdec를 쓰면 GNU Fortran은 논리 연산자의 타입 제약을 완화해서 정수 피연산자를 허용하고, 대신에 해당 하는 **비트별 연산(bitwise operation)**을 수행해요. 이 플래그는 호환성 전용이라 새 코드에서는 피하는 게 좋아요.

다음 코드를 생각해 볼게요.

INTEGER :: i, j
  i = z'33'
  j = z'cc'
  print *, i .AND. j

이 예시에서 -fdec로 컴파일하면 GNU Fortran은 .AND. 연산을 내장 함수 IAND(비트별 논리곱) 호출로 바꿔서, ij의 비트별 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 리터럴 상수