ビット演算のサンプル

Fortranでビット演算をするサンプルスクリプトを作りました。余りソースが無いので、サンプルを動かしながら動作を確かめた方が理解が早そう。

program main
    implicit none
    integer :: i, j, b1, b2, h1, h2, o1, o2

    o1 = 5
    o2 = 21
    b1 = b'00000101'
    b2 = b'00010101'
    h1 = x'05'
    h2 = x'15'
    
    write(*, *) "octal output"
    write(*, '(o4, o4, o4)') o1, o2, o1+o2
    write(*, '(o4, o4, o4)') b1, b2, b1+b2
    write(*, '(o4, o4, o4)') h1, h2, h1+h2

    write(*,*) "hexadecimal output"
    write(*, '(z4, z4, z4)') o1, o2, o1+o2
    write(*, '(z4, z4, z4)') b1, b2, b1+b2
    write(*, '(z4, z4, z4)') h1, h2, h1+h2

    write(*,*) "bit calculation for 0x05 and 0x15"
    write(*, '(a5, z4)') "AND", iand(b1, b2)
    write(*, '(a5, z4)') "OR", ior(b1, b2)
    write(*, '(a5, z4)') "XOR", ieor(b1, b2)
    write(*, '(a5, z16)') "NOT", not(b1)

    write(*, '(1x,a,$)') "(i,j) |"
    do i = 0, 1
        do j = 0, 1
            write(*, '(1x, a,i1,a,i1,a, 1x,$)') &
                & "(", i, ",", j, ")"
        end do
    end do
    write(*,*)

    write(*, '(1x,a,$)') " AND  |"
    do i = 0, 1
        do j = 0, 1
            write(*, '(3x, i1, a,$)') iand(i,j), "  "
        end do
    end do
    write(*,*)

    write(*, '(1x,a,$)') " OR   |"
    do i = 0, 1
        do j = 0, 1
            write(*, '(3x, i1, a,$)') ior(i,j), "  "
        end do
    end do
    write(*,*)

    write(*, '(1x,a,$)') " XOR  |"
    do i = 0, 1
        do j = 0, 1
            write(*, '(3x, i1, a,$)') ieor(i,j), "  "
        end do
    end do
    write(*,*)

end program main

結果

 octal output
   5  25  32
   5  25  32
   5  25  32
 hexadecimal output
   5  15  1A
   5  15  1A
   5  15  1A
 bit calculation for 0x05 and 0x15
  AND   5
   OR  15
  XOR  10
  NOT        FFFFFFFA
 (i,j) | (0,0) (0,1) (1,0) (1,1) 
  AND  |   0     0     0     1   
  OR   |   0     1     1     1   
  XOR  |   0     1     1     0