ビット演算のサンプル(2)

前回のものはibsetやibclrが無かったので、改めて作りました。
C言語でいうsizeof関数の代わりにfortranではsize関数がありますが、配列の長さを確かめることにしか使えません。bit_sizeを使えばデバッグに役立ちそうだと思いました。

! bit operations
program main
    implicit none

    integer(kind=1) :: bbb, ccc

    write(*, '(a20,2x,i3)') "bit size            ", bit_size(bbb)
    write(*,*)

    ! ---------------------------
    write(*,'(a)') "--- Bit Operation ---"
    write(*, '(a20,2x,$)') "initial set 0       "
    bbb = 0
    call output_bit(bbb)

    write(*, '(a20,2x,$)') "set bit 0,2,3       "
    bbb = ibset(bbb, 0)
    bbb = ibset(bbb, 2)
    bbb = ibset(bbb, 3)
    call output_bit(bbb)

    write(*, '(a20,2x,$)') "clear bit 0         "
    bbb = ibclr(bbb, 0)
    call output_bit(bbb)

    write(*, '(a20,2x,$)') "shift bit 2         "
    bbb = ishft(bbb, 2)
    call output_bit(bbb)

    write(*, '(a20,2x,$)') "shift bit -1        "
    bbb = ishft(bbb, -1)
    call output_bit(bbb)
    
    write(*,*)

    ! ---------------------------
    write(*, '(a20,2x,$)') "initial 0x05        "
    bbb = 5
    call output_bit(bbb)

    write(*, '(a20,2x,$)') "initial 0x03        "
    bbb = 3
    call output_bit(bbb)

    bbb = 5; ccc = 3
    write(*, '(a20,2x,$)') "0x05 and 0x03       "
    bbb = iand(bbb, ccc)
    call output_bit(bbb)

    bbb = 5; ccc = 3
    write(*, '(a20,2x,$)') "0x05 or  0x03       "
    bbb = ior(bbb, ccc)
    call output_bit(bbb)

    bbb = 5; ccc = 3
    write(*, '(a20,2x,$)') "0x05 xor 0x03       "
    bbb = ieor(bbb, ccc)
    call output_bit(bbb)

    bbb = 5
    write(*, '(a20,2x,$)') "not 0x05            "
    bbb = not(bbb)
    call output_bit(bbb)

    ! ---------------------------
    write(*,'(a)') "--- Bit Operation ---"
    write(*, '(a20,2x,$)') "shift bit -1        "
    bbb = ishft(bbb, -1)
    call output_bit(bbb)

contains
subroutine output_bit(b)
    integer(kind=1) :: b

    write(*,'(a, z2.2, 2x, a, b8.8)') "0x", b, "0b", b
end subroutine output_bit
end program main

結果

bit size                8
 
--- Bit Operation ---
initial set 0       0x00  0b00000000
set bit 0,2,3       0x0D  0b00001101
clear bit 0         0x0C  0b00001100
shift bit 2         0x30  0b00110000
shift bit -1        0x18  0b00011000
 
initial 0x05        0x05  0b00000101
initial 0x03        0x03  0b00000011
0x05 and 0x03       0x01  0b00000001
0x05 or  0x03       0x07  0b00000111
0x05 xor 0x03       0x06  0b00000110
not 0x05            0xFA  0b11111010
--- Bit Operation ---
shift bit -1        0x7D  0b01111101