2016-06-15 19 views
2

私は理解できないこのC#コードを持っています。 IntToBinループの最初の反復中に、私はシフト演算子が7のバイト値に変換されることを理解しますが、2番目のパスでは、バイト値は224です。整数からBnへの変換

static void Main(string[] args) 
    { 
     IntToBin(2016,2); 
     //Console.Write((byte)2016); 
    } 

    public static byte[] IntToBin(int from, int len) 
    { 
     byte[] to = new byte[len]; 
     int max = len; 
     int t; 
     for (int i_move = max - 1, i_to = 0; i_move >= 0; i_move--, i_to++) 
     { 

      to[i_to] = (byte)(from >> (8 * i_move)); 
     } 

     return to; 
    } 

答えて

1

限り、あなたはこのライン

to[i_to] = (byte)(from >> (8 * i_move)); 

の難しさを持って、私はこれらの番号を取得する方法あなたは簡単に今それ

2016 == 7 * 256 + 224 

をテストすることができます見ることができるように?

シフトオペレータ>>両者の 力によって、実際には、整数除算ある:(byte)キャストが実際に、(byte)ので残りオペレータ% 256 が最後を返し、である

>> 0 - no division (division by 1) 
    >> 1 - division by 2 
    >> 2 - division by 4 
    ... 
    >> 8 * i_move - dision by 2**(8*i_move) i.e. division by 256 ** i_move 

バイト

今度はアンラップループ

i_move == 1 // max - 1 where max = 2 
    to[0] = (from/256) % 256; // = 7 

    i_move == 0 
    to[1] = (from/1) % 256; // = 224 
一般的なケースでは

to[0]  = from/(256 ** (len - 1)) % 256; 
    to[1]  = from/(256 ** (len - 2)) % 256; 
    ... 
    to[len - 3] = from/(256 ** 2) % 256; 
    to[len - 2] = from/(256) % 256; 
    to[len - 1] = from/(1) % 256; 
+0

に試してみましょうありがとうございました。 – AlbertK

+0

@AlbertK:ようこそ! –

関連する問題