【问题标题】:Fortran Subroutine that changes byte order更改字节顺序的 Fortran 子例程
【发布时间】:2015-05-06 17:16:41
【问题描述】:

我在 Fortran 中编写了一个例程来执行反向字节顺序。这将等同于src="1234"; dst="4321"。我想将例程更改为使用变量srcdst 指定的任意排序来设置排序位置。

这是反向字节排序的代码。

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

【问题讨论】:

  • 您的问题是什么? dst 和 src 究竟应该是什么意思?
  • 以上等价于src="1234"; dst="4321"。我想让它适用于我提供的订单。例如src="1234"; dst="2143"。重要的是目标变量dst。 32 位实数有 4 个字节。 dst 说明了每个字节相对于输入的去向。
  • 你需要它快吗?
  • 我想它被称为排列,是的。
  • 如果它很快但不是必需的会有所帮助。有哪些选择?

标签: fortran


【解决方案1】:

你可以这样包装

  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)

进入一个子程序。

够快吗?由你决定。

编辑:我对srcdst 的字符变量的使用似乎引起了一些混乱。如果 srcdst 是实数或整数,则该方法同样有效,例如:

  REAL :: src, dst

请注意确保字符数组的 1 字节元素数量与 srcdst 中的字节数相同。我已经使用字符作为中间表示,因为这些映射 1:1 与字节(在您可能遇到的几乎所有计算机上)并且我已经将 4 字节标量转移到 1 字节标量的 4 元素数组以制作使用 Fortran 的内置索引功能很容易置换。如果srcdat 是字符变量,也更容易看出发生了什么,否则src_arrdst_arr 在写出时通常是不存在的字符的无意义混杂。

【讨论】:

  • 那就不用打电话mvbits了。
  • 是的,我在写评论的时候也想到了向量下标,+1
  • 我很困惑,为什么用Character而不是真正的类型来完成?
  • @Zeus 因为这个答案使用了一个字符(字节)数组,而您只需将数组的不同元素复制到正确的位置。
  • @Zeus 是一个字节的定义,可寻址单元能够容纳一个基本字符。
【解决方案2】:

甚至可以在没有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

【讨论】:

  • 是的,但如果输入和输出是reals 或integers,则此方法不起作用。
  • @HighPerformanceMark 这是真的,那么你需要transfer
  • 我认为字符不受字节序的影响!
  • @Zeus:你为什么现在要加入字节序?顺便说一句:所有字节都可能受到字节序的影响。
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2014-08-24
相关资源
最近更新 更多