Implementieren der logischen Rechtsverschiebung nur mit „~ & ^ | + << >> = ”Operatoren und 20 Operationen

Ich habe also die Aufgabe, eine Funktion in c zu codieren, die nur die bitweisen Operationen ~, &, ^, | verwendet , +, <<, >> und =. Ich muss nur 20 Operationen verwenden. Und ich darf keine Kontrollstrukturen wie if-else für while, switch oder irgendetwas anderes verwenden, das Code in bedingten Blöcken ausschaltet. EbenfallsTyp Casting ist auch raus und die Bytes, die nicht im Funktionsheader deklariert sind (der mir gegeben wird), sind auf 1-Byte- oder 8-Bit-Werte beschränkt; Also habe ich hex 0 bis FF.

Die Funktion, die ich codieren muss, ist eine logische Rechtsverschiebung. Anstelle der Bits, die mit dem Vorzeichenbit aufgefüllt werden, sollten sie also mit Nullen aufgefüllt werden

Das habe ich getan:

int logicalShift(int x, int n) {
    int op=0xFFFFFFFF;
    int tcn=(~n+1);
    int sizeshift=0x20 & tcn;
    op=(op<<sizeshift);
    return ((x>>n) + (op));
}

Dies ist, was ich erwarte zu erhalten (für ein x = 0x80000000 und n = 0x01) Ich erwarte, 0x40000000 zu erhalten, die 1073741824 in Dezimalzahl ist. Das bekomme ich. Jedoch (für ein x = 0x80000000 und n = 0x0 erwarte ich 0x80000000, jedoch bekomme ich 0x7fffffff, was meine Antwort minus ein bisschen ist. Ich könnte ein bisschen hinzufügen, aber es bringt die erste Antwort durcheinander. Also, was mache ich falsch? dass ich den einen fall habe aber nicht den anderen. ich habe es auch versucht.

int logicalShift(int x, int n) {
    int op=0xFFFFFFFF;
    int tcn=(~n+1);
    int sizeshift=0x20 & tcn;
    op=(op<<sizeshift);
    return ((x>>n) + (op  ^ ~n));
}

Ich dachte, wenn ich die Menge der Bits, die die Vorzeichenbits mit allen Einsen für den Fall 0 auf Null setzen, XOR-verknüpft, würde ich zu etwas kommen, das nicht negativ (aka) 0x7fffffff war, als es die Compilerkonvertierung zum Komplement von 2 durchlief. Es wurde schlimmer. Bitte bringen Sie mich in die richtige Richtung. Was muss ich beachten und warum?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage