更改字节顺序的 Fortran 子例程
Fortran Subroutine that changes byte order
我用 Fortran 编写了一个例程来执行反向字节顺序。这将等同于 src="1234"; dst="4321"
。我想将例程更改为使用变量 src
和 dst
指定的任意顺序来设置排序位置。
这是反向字节排序的代码。
Subroutine byteorder (src, dst, x, y)
Real, Intent (out) :: y
Character (Len=*), Intent (in) :: src, dst
Real, Intent (in) :: x
Integer :: i, j
i = Transfer (x, 0)
Call Mvbits (i, 24, 8, j, 0 )
Call Mvbits (i, 16, 8, j, 8 )
Call Mvbits (i, 8, 8, j, 16 )
Call Mvbits (i, 0, 8, j, 24 )
y = Transfer (j, 0.0)
End Subroutine byteorder
你可以像这样包装东西
CHARACTER(len=4) :: src, dst
CHARACTER(len=1), DIMENSION(4) :: src_arr, dst_arr
INTEGER, DIMENSION(4) :: permutation
permutation = [2,4,3,1]
src_arr = TRANSFER(src,src_arr)
dst_arr = src_arr(permutation)
dst = TRANSFER(dst_arr,dst)
进入子程序。
够快吗?你来决定。
编辑:我对 src
和 dst
的字符变量的使用似乎引起了一些混乱。如果 src
和 dst
是实数或整数,该方法同样有效,例如:
REAL :: src, dst
请注意确保字符数组具有与 src
和 dst
中的字节数相同的 1 字节元素数。我使用字符作为中间表示,因为这些映射 1:1 带有字节(在几乎所有您可能遇到的计算机上)并且我已经将 4 字节标量传输到 1 字节标量的 4 元素数组以便使用 Fortran 的内置索引功能轻松排列。如果 src
和 dat
是字符变量,也更容易看出发生了什么,否则 src_arr
和 dst_arr
在写出时通常是不存在的字符的无意义混乱。
甚至可以不用 transfer
:
program test
implicit none
character(len=*),parameter :: src = '1234'
integer,parameter :: perm(4) = [2,4,3,1]
character(len=len(src)) :: dst
integer :: i
do i=1,len(src)
dst(i:i) = src(perm(i):perm(i))
enddo
print *,src,'->',dst
end program
我用 Fortran 编写了一个例程来执行反向字节顺序。这将等同于 src="1234"; dst="4321"
。我想将例程更改为使用变量 src
和 dst
指定的任意顺序来设置排序位置。
这是反向字节排序的代码。
Subroutine byteorder (src, dst, x, y)
Real, Intent (out) :: y
Character (Len=*), Intent (in) :: src, dst
Real, Intent (in) :: x
Integer :: i, j
i = Transfer (x, 0)
Call Mvbits (i, 24, 8, j, 0 )
Call Mvbits (i, 16, 8, j, 8 )
Call Mvbits (i, 8, 8, j, 16 )
Call Mvbits (i, 0, 8, j, 24 )
y = Transfer (j, 0.0)
End Subroutine byteorder
你可以像这样包装东西
CHARACTER(len=4) :: src, dst
CHARACTER(len=1), DIMENSION(4) :: src_arr, dst_arr
INTEGER, DIMENSION(4) :: permutation
permutation = [2,4,3,1]
src_arr = TRANSFER(src,src_arr)
dst_arr = src_arr(permutation)
dst = TRANSFER(dst_arr,dst)
进入子程序。
够快吗?你来决定。
编辑:我对 src
和 dst
的字符变量的使用似乎引起了一些混乱。如果 src
和 dst
是实数或整数,该方法同样有效,例如:
REAL :: src, dst
请注意确保字符数组具有与 src
和 dst
中的字节数相同的 1 字节元素数。我使用字符作为中间表示,因为这些映射 1:1 带有字节(在几乎所有您可能遇到的计算机上)并且我已经将 4 字节标量传输到 1 字节标量的 4 元素数组以便使用 Fortran 的内置索引功能轻松排列。如果 src
和 dat
是字符变量,也更容易看出发生了什么,否则 src_arr
和 dst_arr
在写出时通常是不存在的字符的无意义混乱。
甚至可以不用 transfer
:
program test
implicit none
character(len=*),parameter :: src = '1234'
integer,parameter :: perm(4) = [2,4,3,1]
character(len=len(src)) :: dst
integer :: i
do i=1,len(src)
dst(i:i) = src(perm(i):perm(i))
enddo
print *,src,'->',dst
end program