-2

Im K & R Buch in Kapitel 2.9, ich bin getbits() auf das Verständnis dieser Beispielfunktion steckenK & R: Need Erklärung dieses C-Code in das Verständnis

getbits(x,p,n) 

Gibt die (rechtsbündig) n-Bit Feld von x, das an Position p beginnt. Hier ist der Funktionskörper

/* getbits: get n bits from from position p */ 
unsigned getbits(unsigned x, int p, int n) 
{ 
    return (x >> (p+1-n)) & ~(~0 << n); 
} 

ich eigentlich keine Probleme mit den Bitoperatoren konfrontiert, aber ich kann nicht wirklich die Frage bekommen. Ich bin fest daran, die Frage zu verstehen, vor allem, sie nicht zu lösen. Letztendlich "Was müssen wir in dieser Funktion finden".

+1

Sie können dieses Tool nützlich finden: http: //bitwisecmd.com/ – WhiZTiM

+3

in ANSI C ist dieser Code undefined Verhalten, also mach dir keine Sorgen zu viel. –

+0

@Bathsheba bitte öffnen Sie die Frage, ich habe diese Frage gestellt, weil die Antworten der anderen Frage mich nicht zufrieden stellend –

Antwort

1

Es verschiebt nur die Bits nach p+1-n Bits (um das erforderliche Feld rechtsbündig zu machen), dann maskiert alle außer den unteren n Bits. Hier ist eine erweiterte Version, die einfacher zu verstehen ist:

+0

bitte erklären Sie es mit einem Beispiel Ich denke, ich beginne es zu verstehen –

+0

Was ist, wenn x größer als p + 1-n ist –

+1

@Some_Random_Programmer warum kommst du nicht mit einem Beispiel und versuchen Sie es? Wir können Ihnen dann sagen, ob das, was Sie bekommen, falsch ist. –

0

Das Zeichnen einer binären Darstellung hilft normalerweise für solche Fälle.

Zum Beispiel: unter 3 Bits von Position 5:

X: 101010101 
    --^ 
     p 

Es verschiebt:

X: 1010 
    ^
     p 

Und dann Masken:

X: 010 
    --^ 
     p