C'de Bitlerin Sağa Döndürülmesi

Jan 03 2021

Sağ uçtan düşen bitler sol uçta yeniden belirecek rightrot(int x, int n)şekilde tüm bitleri xn kez sağa kaydırılacak şekilde işlev yazmamızı isteyen K & R'de 2-8 alıştırması üzerinde çalışıyorum .

İşte her biti birer birer kaydırdığım denenen çözümüm:

int rightrot(int x, int n)
{
    int i, rmb;

    for(i = 0; i < n; ++i)
    {
        // get right-most bit
        rmb = x & 1;

        // shift 1 to right
        x = x >> 1;

        // if right-most bit is set, set left-most bit
        if (rmb == 1)
            x = x | (~0 ^ (~0 >> 1) );
    }

    return x;
}

Ben yürütmek zaman rightrot(122, 2), benim hemen bekliyoruz 94beri 122olduğu 1111010ve 94olduğu 1011110. Bunun yerine, 30hangisinin olacağını anlıyorum 0011110. Açıkçası, en soldaki biti ayarlama yöntemim beklediğim gibi çalışmıyor. Bariz bir hata gören var mı? Ben sadece bitleri ve benzerlerini yakalamayı öğreniyorum.

NOT: Bu yazıdan en soldaki biti ayarlama tekniğini aldım .

Yanıtlar

7 mch Jan 02 2021 at 23:21

Analiz edelim (~0 ^ (~0 >> 1) ):

~0is -1
~0 >> 1yine -1, eğer işaret biti 1righthift ise, yeni bitleri 1s ile dolduracaktır .
-1 ^ -1olduğunu 0.
x = x | 0olduğunu x.

Çözüm, bitoperasyonlar yapmak istiyorsanız imzasız veri türlerini kullanmanız gerektiğidir.

Öyleyse satırı kullanmalısınız x = x | (~0u ^ (~0u >> 1) );
Diğer sorunları önlemek için parametre xde olmalıdır unsigned int.

https://ideone.com/7zPTQk