SORU
24 AĞUSTOS 2009, PAZARTESİ


Bir tamsayı verildiğinde, nasıl iki bit öldürmek kullanarak sonraki en büyük güç bulabilirim?

Eğer bir tamsayı n nasıl bulacağım sonraki Sayı k > n k = 2^i i eleman n ına kayması ya da mantık.

Örnek: n = 123, nasıl bir güç olan k = 128, bulabilirim, ve iki tarafından sadece bölünebilen 124. Bu basit olmalıdır, ama beni kendimden geçiriyor.

CEVAP
24 AĞUSTOS 2009, PAZARTESİ


32-bit tamsayı için, bu basit ve kolay bir yol

unsigned int n;

n--;
n |= n >> 1;   // Divide by 2^k for consecutive doublings of k up to 32,
n |= n >> 2;   // and then or the results.
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;
n  ;           // The result is a number of 1 bits equal to the number
               // of bits in the original number, plus 1. That's the
               // next highest power of 2.

Burada daha somut bir örnek. Hadi sayıyı ikili düzende 11011101 olan 221, al:

n--;           // 1101 1101 --> 1101 1100
n |= n >> 1;   // 1101 1101 | 0110 1110 = 1111 1111
n |= n >> 2;   // ...
n |= n >> 4;
n |= n >> 8;
n |= n >> 16;  // 1111 1111 | 1111 1111 = 1111 1111
n  ;           // 1111 1111 --> 1 0000 0000

2^8, temsil eden dokuzuncu konumda bir bit, var ya2 nitekim sonraki en büyük güç olan 256,. Vardiya her biri daha önce el değmemiş sıfır, sonunda 1 bit orijinal dizi bit sayısına eşit sayıda üreten bazı sayısı mevcut 1 bit tüm çakışıyor. Bu değer için bir ekleme 2 yeni bir güç üretir.

Başka bir örnek; ikili 10000011 olan 131, kullanacağız:

n--;           // 1000 0011 --> 1000 0010
n |= n >> 1;   // 1000 0010 | 0100 0001 = 1100 0011
n |= n >> 2;   // 1100 0011 | 0011 0000 = 1111 0011
n |= n >> 4;   // 1111 0011 | 0000 1111 = 1111 1111
n |= n >> 8;   // ... (At this point all bits are 1, so further bitwise-or
n |= n >> 16;  //      operations produce no effect.)
n  ;           // 1111 1111 --> 1 0000 0000

Ve gerçekten de, 256 131 2'den sonraki en yüksek güç.

Eğer sayının bitlerini temsil eden tamsayı kendisi bir güç 2, devam etmek için uzatmak bu teknik verimli ve süresiz (örneğin, ekleme n >> 32 hat için 64-bit tamsayı).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006