2010-12-24 10 views
3

Ich habe den folgenden Code für das MSB bekommen (Most Significant Bit) aus einer nicht-negativen ganzen Zahl, Int32 genauer zu sein:.NET - Ist das MSB der int32-Plattform agnostisch?

private static readonly int[] powersOf2 = new int[] 
             { 
              1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 
              32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 
              8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 
              1073741824 
             }; 

public static int GetMsb(int value) 
{ 
    for (int k = powersOf2.Length - 1; k >= 0; k--) 
    { 
     var bit = (value & powersOf2[k]) != 0; 
     if (bit) 
      return (k + 1); 
    } 
    return 0; 
} 

wieder: Da diesem Wert nicht negativ ist.

Meine Frage ist:
Gewährleistet das .NET-Framework, dass dieser Code auf jeder Plattform ordnungsgemäß ausgeführt werden würde: x86/Windows/Linux/Sun/64bit?

Ist die Int32 Darstellung in .NET, einschließlich Endianness und Bit/Byte-Reihenfolge, Plattform Agnostic?

Vielen Dank im Voraus!
BTW, wenn dies ein Duplikat ist - bitte so schnell wie möglich kommentieren. Vielen Dank!

+0

Es gibt nichts Plattform spezifisch über die Basis-2 Zahlensystem . – kenny

Antwort

3

Solange Sie es behandeln als int, ja es ist plattformunabhängig. Dies umfasst alle arithmetischen und bitweisen Operationen (<<, >> usw.). Die Opcodes stellen immer sicher, dass es das tut, was Sie erwarten.

Jedoch! Wenn Sie unter die Abdeckungen schauen, könnte es von Bedeutung sein; zum Beispiel BitConverter.GetBytes(int) und BitConverter.ToInt32 kümmern uns um die Endianness. Sie können dies mit BitConverter.IsLittleEndian überprüfen; es ist normalerweise true auf "regulär" .NET, aber könnte false vielleicht auf IA64 oder XNA oder Mono auf einigen Architekturen sein.

Die gleiche Logik gilt für alle unsicheren Code, der über [StructLayout] (zum Beispiel) zwischen byte* und int* oder jede Vereinigungen konstruiert nötigt.

Aber in regulären Code, sollten Sie in Ordnung sein.

1

Ihr Code wird immer funktionieren.

Das liegt nicht daran, dass sich die Darstellung von Int32 nicht von Plattform zu Plattform ändert, sondern weil Ihr Code gut genug geschrieben ist, um sich nicht darauf zu verlassen: Sie verknüpfen Int32s mit anderen Int32s. Wenn sich das Format ändert, wirkt sich die Änderung sowohl auf die Nummer, die Sie testen, als auch auf die Einträge in Ihrer Poten- tial-of-2-Tabelle aus. Der Code würde also weiterhin funktionieren.

2

Die Endianness ist plattformabhängig, aber Ihr Code hängt hier nicht von der Endianess ab.

Endianness kommt nur dann zum Einsatz, wenn Sie Low-Level-Elemente wie Pointer, Unio (StructLayout: Explicit) oder BitConverter verwenden.

Bitverschiebungen, Integer-Arithmetik und normale Umwandlungen zwischen Ganzzahl-Typen sind endian-agnostisch.

0

Der Code ist portabel, jedoch gibt es 0 als das MSB für int.MinValue zurück, das tatsächlich in Hexa 0x80000000 ist, da Sie mit signierten Ganzzahlen arbeiten.Hier ist ein Code, der für alle Bits arbeitet, glaube ich, und braucht keine vorberechneten Werte:

public static int GetMsb(int value) 
{ 
    for(int i = 31; i >= 0; i--) 
    { 
     if ((value & 0x80000000) != 0) return i; 
     value <<= 1; 
    } 
    return 0; 
} 

oder mit einem uint:

public static int GetMsb(uint value) 
{ 
    for(int i = 31; i >= 0; i--) 
    { 
     if ((value & 0x80000000) != 0) return i; 
     value <<= 1; 
    } 
    return 0; 
} 
+0

"vorausgesetzt, dass der Wert nicht negativ ist". Danke für den vorgeschlagenen Code. –