我在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
答案 0 :(得分:2)
你可以包装这样的东西
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字节的标量转移到4字节的1字节标量数组来制作使用Fortran的内置索引功能很容易进行置换。如果src
和dat
是字符变量,也可以更容易地看到正在发生的事情,否则src_arr
和dst_arr
在写出时通常是无意义的不存在的字符。
答案 1 :(得分:0)
甚至可以在没有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