Ich schreibe verschiedene Typen in einen Byte-Stream, indem ich manuell Werte werfe und verschiebe. Ich habe festgestellt, dass dies mehr als dreimal schneller ist als mit BitConverter oder BinaryWriter.
Mein Problem ist mit Schwimmern. Ich muss sie in Ints umwandeln, um Shift-Operationen für sie auszuführen, aber jede Umwandlung in int führt zu einer impliziten Konvertierung mit Trunkierung usw. Ich möchte, dass die genaue binäre Darstellung gleich bleibt. Ist das möglich?
z. Ich möchte in der Lage sein, ähnlich zu tun:
%Vor%?
BEARBEITEN: verglichen mit DoubleToInt64Bits
ist langsamer als 4x auf meiner Maschine, was angesichts der Array-Art und des unvermeidlichen Overheads im Vergleich zur extremen Einfachheit von DoubleToInt64Bits
implementation Sinn macht. p>
Folgendes erfordert keinen unsicheren Code und funktioniert nachweislich (ich habe es jahrelang für verschiedene .NET-Versionen verwendet):
%Vor%Beachten Sie, dass die float → int-Richtung einfacher sein kann:
%Vor%Es ist jedoch viel unklarer, weil nicht dokumentiert (nach MSDN ), obwohl dies durch dieser Beitrag . (Das heißt, das Verhalten war 2006 das gleiche wie jetzt im Jahr 2013, und ich sehe keinen Grund, es in Zukunft zu ändern - aber es kann passieren, und ich bin mir nicht sicher, ob dies als rückwärtskompatibel gelten würde ändern oder nicht.)
Können Sie double
anstelle von float
?
BEARBEITEN: Antwort auf Kommentar
Ich glaube, dass es keinen Overhead mit BitConverter gibt, mit Reflector können wir das sehen Die Implementierung ist ziemlich einfach:
%Vor%Tags und Links c# casting bit-manipulation