2012-11-04 14 views
5

したがって、3つの数字があります。 1つはcharであり、他の2つはint16_tshortとも呼ばれますが、表によれば、短絡は確実に16ビットではありません)。異なる長さの2進数を連結する

私はそれらを連結したいと思います。

1001000111111111111111011001011010110101000000000000000000000000

を使用する:

10010001

1111111111111101

1001011010110101

私は含むlong longで終わるしたいと思います。だから、それらの値があったと言います私がオンラインで見つけたいくつかのソリューション、私はこれでうまくいく:

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のサイズと関係があると思うが、私はそれの周りに私の頭を包むことができず、私は後でそれ以上の数字のための部屋が欲しい。

答えて

6

あなたが要求したとして、正しいビットパターンを取得するには、:

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

これは、LSB-最後の24ビットが0を左に、あなたは要求された正確なビットパターンを生成します

1001000111111111111111011001011010110101000000000000000000000000 
3

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

編集によって左シフト:

ちょうど最初のシフトがあまりにも間違っている実現しました。同様の理由から、これも16でなければなりません。

1

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

+0

私はそれを見ていきますが、普通の数字が最も速いので、別のアプローチ(左の代わりに数字を入れていますか?)を考えるかもしれません。 – Cheezey

+0

彼は 'long long'ではなく' long long'を使用しています。 'long long'は少なくとも64ビットしか格納できません。彼は40ビットしか必要としません。 –

0

私はあなたが何をしているかを正しく理解していれば、私が使用します。建物の中に

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

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

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

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

関連する問題