2017-10-11 7 views
0

に32ビットのデータを変換します。私はこのような何かを持っている符号なしlong値

int[] r = { 4123, 2571 }; 
long result = ((r[1] & 0xFFFF) << 16 | (rs[0] & 0xFFFF)); 
System.out.prinln(result); 

は、出力は次のようになります: これは私の試みです

EDIT ... 10111627しかし、私は168497179.は、おそらく私は、変換中に何かを逃したがどのような考えを持っていない取得

これは、値が32ビットレジスタにどのように配置されるかの例です。

+1

10111627は、どのように見ても、4123と2571から構成されていません。 16進数の小さな部分は0x101bと0x0a0bなので、私はそれを0x009a4a8bにすることはできません。どのような成果が得られるべきか、どのように分かっていますか?その部分は、始めるのにも正しいですか? – harold

+1

あなたのコードは正しいです。あなたのテストは間違っています。 – erickson

+0

最新の投稿をご覧ください。値が32ビットレジスタにどのように格納されているかを示す画像があり、その結果がどのように得られるかを示す画像があります。10111627 – Josef

答えて

0

私は集計を試してみて、うまくいけばあなたの質問にいくつかのコメントがすでに示しているものを明らかにする:

あなたのイメージから数を取得したい場合は
00001010 00001011 00010000 00011011 = 0x0A0B101B = 168497179
あります を1つにまとめたlongの値で、2つの整数があります。
0001000000011011 = 0x101B = 4123
0000101000001011 = 0x0A0B = 2571
コードが正しくありませんです。

彼らは0x0A0B & 0x101Bと= 101116270x009A4A8Bの間には二項関係がないことを簡単に示したように私は、16進数に慣れるためにあなたをお勧めします。

BTWイメージは矛盾している:数0x0A0B101B上に見られるように二進数を表すが、小数のバイナリ値をサポートしながら進数は0x0A0B101EEに気付く)を読み取ります。あなたは結果として一緒に連結進数を得ることを期待するように見える

最後に、私はあなたの欠陥を考え出しました。しかし、ここの16進数とは異なり、ではなく、がこのように10進数で動作します!

私はそれを詳しく説明します。あなたは二進数があります
00001010 00001011 00010000 00011011
あなたは簡単にブロックにより、六角ブロックに
0x0A 0x0B 0x10 0x1B
を変換することができますし、ただ一緒に
0x0A0B101B

それらを結合しかし、その魔法が参加するよりも、のみに適用するだけの単純化です16進数がプログラマの間で非常に人気がある理由です。

長いバージョンでは、上のブロック(右)の'基準'で上位のブロック/バイト(左方向)を掛けなければなりません。最も右のブロックには常に1が掛けられます。次のブロックの基底は(最初のブロックに8ビットがあるので)2 = 256 = 0x100です。第3ブロックのベースは(8+8ビット)2 = 65536 = 0x10000です。最後(左端)に(8+8+8ビット)2 = 16777216 = 0x1000000を掛けなければなりません。

は、第2ブロックの一例を作ることができます:

16進:
0x10 || 0x1B
(0x10 * 0x100) + (0x1B* 0x1)
0x1000 + 0x1B = 0x101B

進:
16 || 27
(16 * 256) + (27 * 1)
4096 + 27 = 4123

あなたはそれであなたのイメージに彼らの両方を見ることができるように(小数点以下6/3問題であるE/B問題に気づく)が、何の1627はありません。したがって、バイナリまたは16進数を10進数に変換することは、人間にとっては重要な仕事であり、計算機を使用するのが最良です。

関連する問題