Implementacja logicznego przesunięcia w prawo za pomocą „~ & ^ | + << >> = ”operatory i 20 operacji

Mam więc przypisanie, że muszę kodować funkcję w c, która używa tylko operacji bitowych ~, &, ^, | , +, <<, >> i =. Muszę użyć tylko 20 operacji. I nie wolno mi używać struktur kontrolnych, takich jak, if-else, dla, while, switch lub czegokolwiek innego, co pobudza kod w blokach warunkowych. Równieżodlewanie typu również jest niedostępne a bajty, które nie są zadeklarowane w nagłówku funkcji (który został mi podany), są ograniczone do wartości 1-bajtowych lub 8-bitowych; więc mam hex 0 do FF.

Funkcja, którą muszę kodować, to logiczne przesunięcie w prawo. Zamiast wypełniać bity znakiem bitowym, powinny wypełnić się zerami

Oto co zrobiłem:

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

Tego właśnie oczekuję (dla x = 0x80000000, a n = 0x01) spodziewam się uzyskać 0x40000000, który wynosi 1073741824 w postaci dziesiętnej. To właśnie dostaję. Jednak (dla x = 0x80000000, i n = 0x0 spodziewam się uzyskać 0x80000000, jednak otrzymuję 0x7fffffff, co jest moją odpowiedzią minus. Mogę dodać trochę, ale to zakłóca pierwszą odpowiedź. Więc co robię źle że mam jeden przypadek, ale nie drugi.

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));
}

Pomyślałem, że jeśli XOR zestaw bitów zeruje bity znakowe ze wszystkimi 1-ami dla przypadku 0, to skończyłbym na czymś, co nie było negatywne (aka) 0x7fffffff, gdy przechodził konwersję kompilatorów na uzupełnienie 2-tych. Skończyło się to jeszcze gorzej. Ustaw mnie we właściwym kierunku, co powinienem rozważyć i dlaczego?

questionAnswers(2)

yourAnswerToTheQuestion