| « VB.Net Üzerine | Silver Bullet » |
bir sayının 2 üzeri olup olmadığını bulmak
Yetki kontrolleri için hazırladığımız kütüphanede ihtiyacımız olduğundan ve birazda enteresan bir problem olduğu için buraya da yazmak istedim.
elinizdeki herhangi bir sayının 2 üssü bir sayı olup olmadığını kontrol edecek bir fonksiyon yazın. hızlı çalışması için optimize edin.
örneğin;
8 (2 ^ 3) için true verecek.
128 (2 ^ 7) için true verecek.
132 için false ferecek.
not : hızlı çalışması gerektiği için logaritma gibi fonksiyonlar en son seçenektir.
sonradan gelen düzenleme : yazının güncelliğini koruması için doğru olmayan çözümleri yayınlıyorum sadece.
sonradan gelen ek düzenleme :
Bu açıklamayı yaptığıma biraz üzülüyorum ama 2'nin üsleri ile 2'ye bölünebilir olmak farklı şeylerdir.
Örnek;
6 rakamı 2'ye bölünebilir ama 2 üssü bir rakam değildir.
8 rakamı 2'ye bölünebilir ve 2 üssü (2^3) bir rakamdır.
7 comments
if(sayi%2!=0) return false;
else sayi=sayi/2;
}
return true;
Sayının binary olarak karşılığına bakarız, 2 üzeri olan sayıların içinde tek 1 vardır ve bu 1 en sonda değildir.
public bool ikininKatiMi(uint n) {
byte count = 0;
byte maxbitcount = sizeof(uint) < < 3;
uint number=1;
while (--maxbitcount>0)
{
if ((n &number) == number) if (++count > 1) return false;
number<<=1;
}
return count!=0;
}
bu ifade istenen mi ki, neden konmuş anlamadım. 132 için sağlamaz
public static int CheckPower(int i)
{
if (i%2 != 0) {return 0;}
else
{
if (i/2 == 1){return 1;}
else{return CheckPower(i/2);}
}
}