Logisches Rechtsschieben

OP #1558341
Lesenswert?

Hallo zusammen
Ich habe mal eine eigentlich ganz Simple Frage:

Gibt es in C ein LOGISCHES Rechtsschieben?
Grund ist folgender: Ich habe einen negativen Integer denn ich gerne um 
16bit nach rechts schieben würde, jedoch ohne das Vorzeichen zu 
beachten. Das ist ja nichts anderes als ein Logisches rechts schieben 
statt einem arithmetischen schieben wie man es bsw. durch
1
(iVal>>16)
machen würde und bei dem bei einer negativen Zahl einsen nachgeschoben 
werden.

In Java ging das mit >>>>, aber in C kenne ich da nichts. Oder bleibt 
mir da nichts anders übrig als entweder
1
test |= (iData >> 16) & 0xFFFF;
zu verwenden, oder diesen Schnippsel in Assembler zu schreiben (wenn der 
Controller Logisches rechtsschieben unterstützt)?
OP #1558361
Lesenswert?

Bernhard R. schrieb:
> Logisches Rechtsschieben erreicht man folgendermaßen:
>
> Man nehme eine unsigned Variable und schiebe selbige nach rechts.
> Das wars.
>
> Bernhard

Ahhhh, ok. Dachte das er auch bei einem unsigned das MSB als Vorzeichen 
interpretiert und 1 nachschiebt. Aber es funktioniert mit dem unsigned 
int wunderbar. Vielen Dank!
#1558370
Lesenswert?

wie Bernhard R. schon geschrieben hat:

cast auf unsigned und dann ">>"

Begründung:

Shiften von signed Variablen nach rechts ist von Compiler zu Compiler 
unterschiedlich. Vom GCC weiß ichs definitiv, dass dabei das Vorzeichen 
erweitert wird. Damit ist für z.B. signed int ">>1" gleichbeteutend mit 
"/2".
Bei unsigned Variablen ist der Compiler von C-Standard dazu verpflichtet 
eine Null aufzufüllen. Ganz sauber ist die Angelegenheit aber trotzdem 
nicht, denn die selbst die Repräsentation von vorzeichenbehafteten 
Zahlen ist AFAIK "implementation defined".
#1558378
Lesenswert?

Andreas R. schrieb:

> Shiften von signed Variablen nach rechts ist von Compiler zu Compiler
> unterschiedlich.

Undefiniert stimmt schon, kurioserweise sogar in C99, aber kennst du 
tatsächlich ANSI-C Compiler (also nicht irgendwas von anno 70er), der 
bei negativen Werten Nullen reinschiebt? Mir jedenfalls ist noch keiner 
untergekommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren