4

Fortranにc_int8_t変数があり、基になるビットを符号なし整数として解釈したい場合(算術ではなくインデックス付け用)、変換を行うための最も効率的な方法は何ですか?こんなことしたい

X( some_function( my_c_int8_t_var ) ) = 1

ここで、Xは配列でありsome_function、符号なしの値を含むc_int16_tを返す必要がありmy_c_int8_t_varます。転送、iadd(またはキャストと加算を使用した単純な条件付き)などのオプションを見てきましたが、最も効率的な方法を知りたいです(このインデックス作成は内部ループで行われます)。もちろん、関数である必要はありません。インライン式で実行できるのであれば、それは素晴らしいことです。

編集:このアプローチが他の整数サイズでも機能する場合は便利です...つまり、c_int32_tで符号なしc_int16_tの内容を取得し、c_int64_tで符号なしc_int32_tを取得します。

4

2 に答える 2

3

transfer()ichar()機能を使用できます。何かのようなもの

X(ichar(transfer(my_c_int8_t_var,"a")))) = 1

例えば

 use iso_c_binding
 write (*,*) ichar(transfer(-1_c_int8_t,"a"))

 end

255を返します。

対応する文字の種類(16ビットなど)が見つからない場合は、値にhuge(1._my_integer_kind)を追加する関数を記述します。

integer function indx(i)
  integer(c_int16_t),intent(in) :: i

  if (i<0) then
    indx = 2*(huge(i)+1) + i
  else
    indx = i
  end if
end function indx

また

  integer function indx2(i)
    integer(c_int8_t),intent(in) :: i

    indx2 = TRANSFER([i,0_c_int8_t],1_c_int16_t)
  end function indx2

この最後のケースは、リトルエンディアンプラットフォームでのみ機能します。

この関数への汎用インターフェースを作成できます。

 write (*,*) indx(-2_c_int16_t)

65534を与える

于 2012-11-16T11:58:17.430 に答える
0

どうですか

integer(c_int16_t) :: i, i2(2)
integer(c_int32_t) :: i32

equivalence (i32, i2)

i2(2) = 0

その後、ループ内

i2(1) = i
X(i32) = 1

これは機能しますか?リトルエンディアンプラットフォームの場合、16ビットデータをi2(1)またはi2(2)に入れる必要がありますか?

于 2012-11-16T13:06:39.767 に答える