2016-06-15 19 views
2

Ich habe dieses Stück C# -Code, die ich nicht verstehen kann. Während der ersten Iteration der IntToBin-Schleife verstehe ich, dass der Shift-Operator ihn in den Byte-Wert von 7 umwandelt, aber beim zweiten Durchlauf ist der Byte-Wert 224. Wie wird der 224 erreicht.Integer zu Bn Umwandlung

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; 
    } 

Antwort

1

Soweit ich sehen kann, Sie Schwierigkeiten haben, mit dieser Linie

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

Sie leicht, dass

testen
2016 == 7 * 256 + 224 

Nun, wie diese Zahlen zu bekommen?

Verschiebungs-Operator >> ist in der Tat eine ganzzahlige Division durch Zweierpotenzen:

>> 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 

während (byte) gegossen wird, in der Tat, Rest Operator % 256 da (byte) gibt die letzten Byte.

Kommen wir nun zu unwrap die Schleife versuchen

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

    i_move == 0 
    to[1] = (from/1) % 256; // = 224 

Im allgemeinen Fall

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

Ihnen sehr danken. – AlbertK

+0

@ AlbertK: Gern geschehen! –