2017-02-06 3 views
0

私はこれらを1バイト(0-255)にパックしようとしている3つの数字があります。バイトに複数の数値をビットパックでパック

Dim num0 As Integer = 6 
Dim Num1 As Integer = 17 
Dim Num2 As Integer = 30 

Dim Packed As Integer = (num0 And &HFFFF) << 1 Or (Num1 And &HFFFF) << 16 Or Num2 And &HFFFF 

Dim GotNum0 = (Packed >> 1) And &HFFFF 
Dim GotNum1 = (Packed >> 16) And &HFFFF 
Dim GotNum2 = Packed And &HFFFF 

しかし、出力は10、16、20

誰でも助けることができるです。

+4

ええ、そのコードはかなり間違っています。基本的な問題も同様に、Num0は少なくとも3ビット、Num1は5ビット、Num3は5ビットが必要です。 3 + 5 + 5ビットは8ビットバイトに収まりません。基本的な問題をどのように解決しようとしているかははっきりしていません。まあ、しないでください、構造を使用してください。 –

+0

はい、同意します。ありがとう、 – dave88

答えて

-1

これらの3つの数値を1バイトにパックすることはできません。Integerから3バイトを使用してパックすることができます。 Packedの1バイトをマスクで選択して、それぞれの数値に使用します(最大値255)。次にPackedに変換:

Dim num0 As Integer = 6 
Dim Num1 As Integer = 17 
Dim Num2 As Integer = 30 

Dim Packed As Integer = (num0 And &HFF) Or ((Num1 << 8) And &HFF00) Or ((Num2 << 16) And &HFF0000) 

Dim GotNum0 = Packed And &HFF 
Dim GotNum1 = (Packed And &HFF00) >> 8 
Dim GotNum2 = (Packed And &HFF0000) >> 16 
+0

このコードはバイトでパックされていませんが、最大値15(255ではなく)のnybbles(半分のバイト、つまり4ビット)でパッキングされています。しかし、Num1とNum2のシフト操作はそれぞれのマスクの外にその値をシフトするので、これらの操作の後にGotNum1とGotNum2は両方ともゼロの値を有する。シフト演算を4ビットと8ビットに変更すると、nybbleパッキング演算が整列しますが、最大値packableが15であるため、データを切り捨てます。その場合、GotNum1は1(17ではなく)の値を持ち、GotNum2は14(30ではなく)の値を持ちます。 – MarkL

+0

ありがとうございました – salvolds

+0

コードの編集で特定された問題が修正されていますが、この回答は最初にはありませんでしたが、値は_singleバイトにパックされていました。ハンスが元の投稿に対するコメントで指摘しているように、質問の言葉を考えれば、これは可能ではありません。 – MarkL

関連する問題