2016-06-24 15 views
1

intにビット単位の演算を実行し、配列に格納するコードを読んでいます。私は各ステップのバイナリ表現を調べ、コードの横にこれを含めました。別のコンピュータ上でビット単位の計算を理解する

、配列のバフがメッセージとして受信し、質問があるのはなぜ[42,56,da,1,0,0]

として進で表示され、どのように、元の番号が進数からだったかを把握できます。私は4256は、'B''V'のASCIIに相当します。しかし、どのようにして番号423を得るのですかda '0'

おかげ

+2

どこから来る、あなたが見ることができ、42と56は*です16進数*はそれぞれ「B」および「V」のASCII表現です。または、0x42と0x56は、より明確で簡潔です。 – glglgl

+0

注: 'int'が16ビットの場合、'reading»16'と 'reading»16'は定義されていません。 – chux

+0

@chux:申し訳ありませんが、私は左側のオペランドについて考えました。あなたはもちろん、右側についても正しいです。私の悪い! – Olaf

答えて

5

DA 01 00 000x000001DAまたはちょうど0x1DAのリトルエンディアン表現です。これは今度は256 + 13 * 16 + 10 = 474です。この番号を持っていて、後でプログラムを変更して再コンパイルするのを忘れたのでしょうか?反対側からそれを見

、423は0x1a7です...

+0

非常に助けていただきありがとうございます。私は別の質問をすることができます - 配列に数値を入れるためにこのビット単位の演算を実行する必要があるのはなぜですか?私はなぜコードがこれに似ているのだろうか?ありがとう – pelican

+0

@ペリカンカウンター質問:あなたはそれを他にどのようにしますか?複数のバイトにまたがる値から2番目または3番目のバイトをどのように取得しますか?唯一の方法は、必要な部分が下位8ビットになるように番号をシフトし、次にそれらを切り取ることです。これらのステップを逆にして、 'buff [5] =(reading&FF000000)>> 24;'を実行することもできますが、それは間違いを招く可能性があるので危険です。 – glglgl

3

glglが、それはA7でなければなりません言うようにそれは正確には

buff[2] = reading&0xff; // 10100111   = 0xa7 
    buff[3] = (reading>>8)&0xff; //00000001  = 1 
    buff[4] = (reading>>16)&0xff; //00000000  = 0 
    buff[5] = (reading>>24)&0xff; ////00000000  = 0 
関連する問題