2010-03-25 35 views
5

Bir baytta biraz ters çevirme yapmaya çalışıyorum. Ben O (32 bit makinede) biraz reversler olabilirBit Bit çevirme

static int BitReversal(int n) 
{ 
    int u0 = 0x55555555; // 01010101010101010101010101010101 
    int u1 = 0x33333333; // 00110011001100110011001100110011 
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111 
    int u4 = 0x0000FFFF; 
    int x, y, z; 
    x = n; 
    y = (x >> 1) & u0; 
    z = (x & u0) << 1; 
    x = y | z; 

    y = (x >> 2) & u1; 
    z = (x & u1) << 2; 
    x = y | z; 

    y = (x >> 4) & u2; 
    z = (x & u2) << 4; 
    x = y | z; 

    y = (x >> 8) & u3; 
    z = (x & u3) << 8; 
    x = y | z; 

    y = (x >> 16) & u4; 
    z = (x & u4) << 16; 
    x = y | z; 

    return x; 
} 

aşağıdaki kodu kullanabilirsiniz, ancak bir sorun, Örneğin, giriş ben 10111110001 almak istiyorum, 10001111101, ancak bu yöntem yoktur 0'ların başı da dahil olmak üzere tüm baytı tersine çevirir. Çıktı 10111110001000000000000000000000'dir. Sadece gerçek sayıyı tersine çevirmek için herhangi bir yöntem var mı? Onu string ve reverser'a dönüştürmek istemiyorum, sonra tekrar dönüştürüyorum. Herhangi bir saf matematik yöntemi veya bit işlemi yöntemi var mı?

Saygılarımızla,

+0

Yönteminizi anladığım halde, u4'ü kullandığınızdan ve örneğinizde tanımlamamış olmanız nedeniyle derleme yapamamaktadır. –

+0

int u4 = 0x0000FFFF; – user287792

+0

Nedeni bu değil, sadece bunu özlüyorum. –

cevap

1

Sevimsiz yolu sağ 1 elde edene kadar kaydırmaya etmektir Sen unsigned int tüm değişkenleri geçmeniz gerekir. Yazılı olarak, herhangi bir zamanda doğru kayma olduğunda istenmeyen işaret uzantısı olabilir.

+0

Girilen değerin sıfır olup olmadığını kontrol etmelisiniz, bumpuse sonsuz bir döngü ile sonuçlanabilir. –

+0

İmzalı bir sağ kaymada işaret bitinin ne yaptığına dikkat edin, uygulama tanımlı. Muhtemelen doğru olanı, soru işareti kodunun imzasız int'e geçmesidir: imzalanması için bir neden yoktur ve güçlüklere değmez. –

4

benzer bir yaklaşım kullanarak ve sağa 33'e çıkan bitleri vardiya en yüksek bit numarası alın - #bits ve işte!

0

Bir yöntem n numaralı sayıdaki n bit işareti sayısını bulmak ve bu sayede yukarıdaki algoritma ile çalıştırmaktır.

if (x != 0) { 
    while ((x & 1) == 0) { 
     x >>= 1; 
    } 
} 

Not:

+0

Bu yanlış: 1000 (yüksek bit 3) << 3 olur ve bu nedenle 10000000 ve tersine bu 0x02000000, ve değil 1! –

+0

@Ritsaert: 1000'in 24 önde gelen işaret biti vardır, yani siz onu 24'e çevirirsiniz, 3 –

0

Tüm 32 bitlerin önemli olduğunu ve her şeyi tersine çevirdiğini varsayar. En yüksek 1'i bularak anlamlı bit sayısını tahmin etmeyi denemelisiniz, ancak bu kesinlikle doğru değildir, bu yüzden işlevi değiştirmenizi öneririm, böylece önemli bitlerin sayısını belirten ikinci bir parametre alır. Sonra bitleri tersine çevirdikten sonra sadece sağa kaydırın.

0

Integer.reverse (int x);

İlgili konular