3

私の質問は、次の例では何をしval = val >> 2;ますか? つまり、4で割ると思います。

int val = 12345678;
val = val >> 2;

これがこの質問の背景です。

12345678 などの水道メーターからの読み取り値があります。当社の水道メーターの動作では、読み取りのために右側の 2 桁が破棄されるため、実際には 123456 が読み取られます。(水流がどのようにレジスターを回転させるかに関係する 2 つの右側の数字を捨てるのには理由があります。ただし、それは私の質問とはまったく関係ありません。)

現在、4GL 整数変数を使用して 12345678 を 100 で除算しているため、10 進数が得られません。予期しない切り捨てが発生しており、ビット シフトの方が適切かどうかを判断しようとしています。

読み取りが 123456 に切り捨てられた後、最後の読み取り (これも切り捨てられます) を使用してデルタが計算され、そこから消費量が生成されます。

私は Informix 4GL で C を使用できます。最下位 2 桁を削除する最善の方法は、2 だけ右にビット シフトすることだと思います。それが、取得しようとしている唯一の方法だと思います-たとえば-

5 digit meter   12345 --> 123
6  "     "     123456 --> 1234
7  "     "    1234567 --> 12345

素朴な質問にお付き合いいただきありがとうございます。私たちは、メーターと通信するエンドポイントがどのようにプログラムされているか、そしてエンドポイントから出てくるデータが実際に何を意味するかという問題を理解しようとしています.

4

4 に答える 4

10

ビットシフトは、10 進数ではなく、2 進数の最後の 2破棄します。これは整数の 4 除算に相当します。10 進数の最後の 2 桁を破棄するには、100 で整数除算する必要があります。

101111000110000101001110ビン= 12345678 dec

101111000110000101001110ビン>> 2 10月 = 1011110001100001010011ビン

1011110001100001010011ビン= 3086419 dec

于 2012-07-13T18:28:51.700 に答える
4

'>>' は、ビットごとのシフト演算を実行します。

その動作を理解するには、まず 12345678 をバイナリに変換します。

12345678 = 100101101011010000111

「>>」は、各ビットを右にシフトすることを意味し、例では2桁です。(<< 左にシフト)

100101101011010000111 >> 2 = 001001011010110100001

次に、10 進数に戻す: 308641

于 2012-07-13T18:36:18.217 に答える
1
12345678       : 101111000110000101001110
12345678 >> 2  : 1011110001100001010011
12345678 / 4   : 1011110001100001010011
于 2012-07-13T18:38:06.340 に答える
1

i4gl 内では、数字を簡単に CHAR にキャストし、[1,6] に切り捨ててから、INT にキャストし直すことができます。

編集: i4gl での型変換を参照してください

于 2012-07-14T00:28:19.647 に答える