私はJavaやCなどの言語を使用するため、ビットシフトオペランドを使用する必要があります。例:RPGLEでのビットシフト
myValue <<= 1
RPGLEで同じことを達成するにはどうすればよいですか? (可能な場合)
私はJavaやCなどの言語を使用するため、ビットシフトオペランドを使用する必要があります。例:RPGLEでのビットシフト
myValue <<= 1
RPGLEで同じことを達成するにはどうすればよいですか? (可能な場合)
、2による除算、4、>>について8等、2を掛け、4、8等
N = 1、2から2、4、8等を取得するには、 3、%inth(2 ** n)を使用します。
小数点以下の桁数を避けるには、除算の場合は/演算子ではなく%divを使用します。
C:
n = 5;
i <<= n;
i >>= n;
RPG:
n = 5;
i *= %inth(2 ** n);
i = %div(i : %inth(2 ** n));
or
i = shift_left (i : n);
i = shift_right (i : n);
dcl-proc shift_left;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return value * %inth(2 ** shift);
end-proc;
dcl-proc shift_right;
dcl-pi *n int(20);
value int(20) value;
shift int(20) value;
end-pi;
return %div(value : %inth(2 ** shift));
end-proc;
できません。
AND、OR、XOR、はい...シフト番号。
あなたは他の言語でできることはすべてRPGで実行可能でなければならないと思うようです。それは...そしてそれは大丈夫です。 ILEについての素晴らしい点は、ビットシフトを行い、必要に応じてRPGから呼び出すCプロシージャーを簡単に作成できることです。
もちろん、2^n ...と同じ結果を掛けることもできますし、おそらくコンパイラはそれをビットシフトに最適化します。しかし、符号なし整数変数を使って作業する必要があります。
RPGは少しtwiddly言語ではありません。これはビジネス上の問題を解決するために作成されたもので、通常はビットシフトはビジネス上の問題を解決するために必要なものではありません。しかし、RPG IVは他のILE言語とうまく連動するILE言語です。ビットをシフトする必要がある場合は、Cでシフトを実行する関数を作成し、RPGプログラムから呼び出すことができます。あなたはC関数が呼び出された場合は
だから整数をシフトishiftl
左:
int ishiftl(int i) {
return i << 1;
}
をあなたはこのようなRPGのプロトタイプを作成する必要があります。
dcl-proc ishiftl int(10) ExtProc('ishiftl');
i Int(10) value;
end-proc;
次に、あなたがこのようにそれを呼び出すことができます:
dcl-s result Int(10);
dcl-s num Int(10);
result = ishiftl(num);
注: Cであります大文字と小文字を区別する言語であり、関数名を定義する場合は重要です。 RPGは大文字小文字を区別せず、すべての識別子は暗黙的に大文字に変換されます。だから、ExtProc( 'name')は、C関数が定義されている場合に、C関数の名前を明示的に定義する必要があります。また、覚えておくべきことがいくつかあります。 1つはCが引数を値渡しすることです。 RPGでC関数のプロトタイプを作成する方法に特に慣れていない場合は、Barbara Morrisが手助けとなるチートシートを書きました。それはhereに位置しています。
もちろん、関数呼び出しは、言語機能としてのビットシフト、乗算または除算を使用して得られるパフォーマンス上の利点を無効にします。 – jmarkmurphy
時期尚早な最適化ですか? – jmarkmurphy
多分ハハハ:) – LppEdd
あなたは私の更新を破った:コンパイラは、ビットシフトにこのような操作を最適化していますか? – Charles
@Charles私はパフォーマンスのためにビットシフトを見ていましたが、これは最適ではないと思います。つまり、ビットシフトのより高いレベルの「抽象」です。 – LppEdd
RPGコンパイラはビットシフトを最適化しません。私は最適化する翻訳者がそれをするかどうかわかりません。 –