5

だから私は3つの数字を持っています。1つはacharで、他の2つはint16_t(sとも呼ばれshortますが、表によると、ショートは確実に16ビットではないことがわかりました)。

それらを連結したいと思います。したがって、それらの値は次のとおりであると言います。

10010001

1111111111111101

1001011010110101

私は次のものを含むことになりたいlong longです:

1001000111111111111111011001011010110101000000000000000000000000

私がオンラインで見つけたいくつかの解決策を使用して、私はこれを思いついた:

long long result;
result = num1;
result = (result << 8) | num2;
result = (result << 24) | num3;

しかし、それは機能しません。デコードすると非常に奇数になります。

私のデコードコードに問題がある場合は、ここにあります:

char num1 = num & 0xff;
int16_t num2 = num << 8 & 0xffff;
int16_t num3 = num << 24 & 0xffff;

何が起きてる?のサイズに関係しているのではないかとlong long思いますが、頭を包み込むことができず、後でもっと数字を入れる余地が欲しいです。

4

4 に答える 4

12

要求どおりに正しいビットパターンを取得するには、次を使用する必要があります。

result = num1;
result = (result << 16) | num2;
result = (result << 16) | num3; 
result<<=24;

これにより、要求した正確なビット パターンが得られます。LSB エンドの 24 ビットは 0 のままです。

1001000111111111111111011001011010110101000000000000000000000000
于 2012-11-04T21:16:10.573 に答える
3

その最後のシフトでは、24ではなく16だけシフトする必要があります。24は、num1とnum2の組み合わせ後の、バイナリ文字列の現在の長さです。16ビットであるnum3のためのスペースを作る必要があるので、16だけ左にシフトします。

編集:

最初のシフトも間違っていることに気づきました。同様の理由で、これも16になるはずです。

于 2012-11-04T20:13:20.890 に答える
1

あなたが何をしているのかを正しく理解していれば、次を使用します。

result = num1;
result = (result << 16) | num2;
result = (result << 16) | num3;

num1out = (result >> 32) & 0xff;
num2out = (result >> 16) & 0xffff;
num3out = result & 0xffff;

構築中の左シフトは、次に挿入する数値の幅です。抽出時の右シフトは、構築中にフィールドが左にシフトされたビットの総数によるものです。

上記のコードをテストしました。long long は、g++ コンパイラを使用したこのタスクには十分な幅であり、他の多くのタスクを信じています。

于 2012-11-04T20:41:21.000 に答える
1

はい、longに格納できる値をオーバーフローしています。任意の精度のライブラリを使用して、GMPのような大きな数を格納できます。

于 2012-11-04T20:13:51.533 に答える