2016-07-19 28 views
0

Im Versuch, die FunktionSetzen von Bits bei Verschiebungen unter Verwendung von bitweisen Operatoren

int test(int x, int y) 
{ 
    int result = 0; 
    int i; 
    for (i = y; i <= x; i++) 
    result |= 1 << i; 
    return result; 
    } 

die zwei ints nimmt zu replizieren und ein Bit für jede Position zwischen den beiden Nummern setzt. Angenommen, 0 (0) < = x < = 31 und 0 < = y < = 31. Zum Beispiel (7, 5) wird 1 bis 1110 0000 gesetzt, wo ein Bit nach dem Verschieben von 5, 6 und 7 mal gesetzt wird.

Ich versuche das Gleiche zu tun, bin aber darauf beschränkt worden, nur bestimmte bitweise Operatoren zu verwenden (~ & + < <). Allerdings habe ich Schwierigkeiten, einen Weg zu finden, der keine Schleife verwendet. Die Funktion sollte 0 zurückgeben, wenn y> x.

Ich glaube, ich kann den oder Operator x | y mit ~ replizieren (~ x & ~ y).

und x^y unter Verwendung von ~ (~ (& y) & ~ (x & ~ y));

http://www.tutorialspoint.com/cprogramming/c_operators.htm

+1

Einfacher zu replizieren, wenn der Code 'unsigned test (unsigned x, unsigned y) 'anstelle von' int' verwendet. Negative Werte und "int" Überlauf sind ein Schmerz. – chux

+0

Aufruf von '+' einem 'bitweisen Operator' ist ein wenig ungewöhnlich. Das Problem ist also, dass die überarbeitete Funktion einen Bereich von Werten für "x" und "y" (was ist der maximal zulässige Wert - 6, 7, 14, 15, 30, 31, 62, 63?) Und muss _not_ verwenden Sie eine Schleife, um dies zu tun? Kann es Konditionale verwenden? –

+0

@ JonathanLeffler Entschuldigung, der Bereich ist 0 <= x <= 31, und 0 <= y <= 31. Korrekt im versuchen, dies ohne Schleifen zu tun und kann Conditionals nicht verwenden. – Silverfin

Antwort

0

Wenn Sie - verwenden, können Sie es wie folgt tun könnte:

int test(int x, int y) 
{ 
    int mask1 = (1 << y) - 1; 
    int mask2 = (1 << (x+1)) - 1; 
    int result = mask1^mask2; 
    return result; 
} 

für y prüfen> x wird für den Leser als Übung.

+0

Ich dachte, dass sowohl - als auch^eingeschränkt sind. – Silverfin