Cast float zu int ohne jegliche Konvertierung?

9

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%     
GazTheDestroyer 07.11.2011, 14:13
quelle

3 Antworten

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

Valentin Kuzub 07.11.2011, 14:29
quelle
14

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

    
robert4 29.05.2013 19:18
quelle
6

Können Sie double anstelle von float ?

verwenden? %Vor%

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%     
sll 07.11.2011 14:18
quelle

Tags und Links