2 Stimmen

Bitweise Operationen

A) (Int32)X | ((Int32)Y << 16) ;

B) (Int32)X + (Int32)Y * (Int32)Int16.MaxValue ;

Sollten nicht beide gleichwertig sein? Ich weiß vom Testen, dass die erste wie erwartet funktioniert, aber aus irgendeinem Grund tut die zweite nicht. Sowohl X als auch Y sind Kurzschlüsse ( Int16 ), und der Rückgabetyp ist eine ganze Zahl ( Int32 ).

Sollte nicht Y << 16 <=> Y * Int16.MaxValue ?

6voto

dtb Punkte 205441

Um das gewünschte Verhalten zu erreichen, müssen Sie mit folgenden Werten multiplizieren 0x10000 (d.h. UInt16.MaxValue+1 ). Int16.MaxValue es 0x7fff .

5 << 16
327680

5 * 0x10000
327680

Vergleiche mit dem Dezimalsystem: Wenn Sie die Zahl 5 auf 500 "verschieben" wollen, müssen Sie mit 100 multiplizieren, nicht mit 99 :-)

2voto

Tal Pressman Punkte 7113

Bei Ihrem zweiten Ansatz gibt es 2 Probleme:

  • Int16 ist vorzeichenbehaftet, so dass der Maximalwert tatsächlich nur 15 Bits beträgt.
  • Der maximale Wert, der durch 16 Bits dargestellt werden kann, ist 2^16 - 1.

1voto

RBarryYoung Punkte 53364
Right-shift 16 bits = * 2^16

Aber:

Int16.MaxValue = 2^15-1

Ich denke, dass Sie einen vorzeichenlosen 16-Bit-Maximalwert + 1 benötigen.

1 Stimmen

Vorzeichenloser 16-Bit-Maximalwert ist immer noch 2^16-1.

1voto

nik Punkte 12812

Dabei übersehen Sie, dass Ihr MaxValue eine Potenz weniger als zwei ist, und dass Sie zunächst ein größeres Problem zu lösen haben:

El OR y SUMME Operationen nicht ähnlich sind. Wenn Sie mit 32-Bit-Ganzzahlen und 16-Bit-Verschiebungen arbeiten, gibt es trägt mit Ihrem + Betrieb und bitweise ODER-Verknüpfung con el OR Betrieb.

Die beiden Wege sind also recht unterschiedlich.

Durch die MaxValue-Interpretation unterscheiden sich Ihre beiden "Verschiebeversuche" natürlich. Es sollte sein (x * MaxValue + x) o (x * (MaxValue+1)) .

1 Stimmen

Da die Originalwerte 16-Bit sind, gibt es keinen Übertrag/Überlauf.

0 Stimmen

Ah! Ich scheine den int16-Bezug übersehen zu haben. Dann ist es auch wahrscheinlich, dass der Compiler OR wie auch immer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X