2016-02-02 2 views
5

Ich arbeite mit einigen bitweisen Operatoren und ich möchte die letzten 16 Binärziffern einer Zahl extrahieren und eine Operation mit ihnen ausführen. Ich möchte im Grunde eine negative int wie 0xFFFFFFFF sehen und dann extrahieren Sie das LSB FFFF und verketten sie mit 0, so dass ich mit einer Null enden, so dass es wie 0x0000FFFF aussieht. Ich sorge mich nur um kleinere negative Zahlen, also sollte das LSB alle Informationen sein, die ich brauche.Wie bekomme ich die letzten 16 Binärziffern einer negativen Zahl und verkette sie?

Hier ist mein Ansatz in C:

#include <stdio.h> 

int main(){ 
    int a = -1, c = 0; 
    short b = (short)a; 
    printf("a is %x\nb is %x",a,b); 
    c = (0 << 16) | b; 
    printf("\nc is %x\n", c); 
    return 0; 
} 

Mein Denkprozess ist, dass ich meine int a auf eine kurze umwandeln kann, so dass es wie FFFF statt FFFFFFFF aussieht werde ich eine bessere Zeit. Leider druckt das für mich nur ffffffff für die Variablen

+2

die Besetzung in '(kurz) a' ist nicht erforderlich, da jede breiter Wert wird automatisch abgeschnitten –

+0

@ LưuVĩnhPhúc danke. Gibt es einen Grund, bei der Bit-Manipulation zu kurz zu greifen? –

+2

es wird in einigen Fällen benötigt, aber nicht in diesem Fall –

Antwort

5

Was Sie haben, funktioniert nicht, weil der bitweise OR-Operator (|) jedes Bit setzt, das in beiden Operanden festgelegt ist.

Sie möchten den bitweisen UND-Operator (&) verwenden, um die nicht gewünschten Bits auszublenden. Dies löscht jedes Bit, das in beiden Operanden klar ist.

ändern diese:

c = (0 << 16) | b; 

Um dies:

c = b & 0xFFFF; 

Und Ihr Ausgang wird sein:

a is ffffffff 
b is ffffffff 
c is ffff 
+0

so für die 16 MSB würde ich 'c = b & 0xFFFF0000' sagen? –

+1

@ user3470987 Fast. Das gibt dir '0xFFFF0000'. Wenn Sie '0x0000FFFF' wollen, müssen Sie' c = (unsigned int) (b & 0xFFFF0000) >> 16' eingeben. Die Besetzung wird benötigt, um zu verhindern, dass '1' Bits von links eingeschoben werden. – dbush

Verwandte Themen