前回のものは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