Rechts-shift mit Nullen am Anfang

Ich versuche zu tun, eine Art Verschiebung nach Links, das wäre Nullen, die am Anfang anstelle von ones. Wenn ich beispielsweise die linke shift -0xff, bekomme ich diese:

0xff << 3 = 11111000

Allerdings, wenn ich rechts verschieben, bekomme ich diese:

0xff >> 3 = 11111111

Gibt es eine operation, die ich verwenden könnte, um das äquivalent von einer Verschiebung nach Links? also ich würde gerne dieses:

00011111

Jede Anregung?

Bearbeiten

Antwort auf die Kommentare, hier ist der code, den ich verwende:

int number = ~0;
number = number << 4;   
std::cout << std::hex << number << std::endl;

number = ~0;
number = number >> 4;
std::cout << std::hex << number << std::endl;

Ausgabe:

fffffff0
ffffffff

Da es scheint, dass im Allgemeinen sollte es funktionieren, ich bin interessiert, warum dieser bestimmten code nicht. Irgendeine Idee?

  • Diese Frage macht keinen Sinn. Sollten Sie nicht das Ergebnis bekommen, das Sie beschreiben, auf einen C-compiler. Poste bitte den aktuellen code.
  • Die 0xff << 3 geben sollte 11111111000 Und die 0xff >> 3 geben sollte 11111
  • Das ist nicht wahr! Wenn der Wert ein Vorzeichen, das ist eigentlich ein korrektes Verhalten gemäß dem C-standard (effektiv, das Vorzeichen-bit wird beibehalten.) Es ist eine Implementierung konkreten Fall.
  • Nein... die Literale in der Frage vom Typ integer, mit Vorzeichen, aber Sie wird positiv sein. Kein Zeichen-bits gesetzt sind, ist nichts negatives. Der C-standard ist nur besorgt, ob der integer negativ ist oder nicht. C11 6.5.7/4 (Links-shift) "If E1 has a signed type and nonnegative value..." "...otherwise, the behavior is undefined." C11 6.5.7/5 (right shift) "If E1 has a signed type and a negative value, the resulting value is implementation-defined."
  • der Grund, es ist keine Implementierung-definiert ist, dass INT_MAX ist garantiert mindestens 2^16-1. So 0xff ist ein positiver Wert des Typs int, und es kann nach Links verschoben werden, die durch 3 ohne überschreitung INT_MAX. Was der Fragesteller beschreibt, ist nicht konform Verhalten, also entweder es ist nicht das, was sein code hat wirklich sonst seine compiler kaputt.
  • Hrm, Ihr seid richtig. Ich dachte (bei 5somethingAM), die 0xff wäre ein signed char aber offensichtlich ist das falsch. Ich mich zurückziehe, meine Vorherige Aussage. Kaffee, dann etwas verschieben.
  • Ich habe bereits meine Frage mit Beispiel-code. Ich bin mit C++, und getestet mit gcc und msvc. Bin ich etwas fehlt?
  • bitte sehen Sie sich den Beispiel-code, den ich verwende.
  • ~0 ist nicht gleich 0xff.

InformationsquelleAutor laurent | 2013-01-18
Schreibe einen Kommentar