C++ Dersleri | Bit Manipulasyon - En Sağdaki Set Edilmiş Biti Resetleme

 Başlığın açıklayıcı olduğundan çok da emin olamadım :) Ancak durum şudur: 00110000 şeklinde güzide bir bit dizemiz olsun: Amacımız bu bit dizesinde en sağda bulunan 1 'i tespit edip 0 yapmak : yani yukarıdaki arkadaşı şuna çevirmek istiyoruz: 00100000 Kodumuz şu şekilde :

template <typename T>
T resetTheRightMostSetBit(T n)
{
	return n & (n - 1);
}
int main()
{
 	int a = 48;     // 00110000
	a = resetTheRightMostSetBit(a); // 00100000 -> 32
	cout << "a=" << a << endl;  
}

Template konusunu henüz yazmadık, ileride yazdığım zaman buralara linkini bırakıyor olurum-unutursam bir yorumla hatırlatır mısınız bana? :) - bilmeyen arkadaşlarımız için: kısaca anlatalım yine de T bir typename dolayısıyla hemen altına yazdığımız fonksiyonun içine herhangi bir tipte veri gönderip aynı tipte geri dönüş yapabilmesini sağlıyoruz, yani bu fonksiyonu int için ayrı char için ayrı byte için ayrı ayrı yazmamış oluyoruz. Bu şekilde yazmamın nedeni farklı örneklerle içeriklere devam etmek, basitçe şöyle de yapabilirdik :

int main()
{
	int a = 48;     // 00110000
	a = a & (a - 1); // 00100000 -> 32
	cout << "a=" << a << endl;  
}

her iki kod da bize  a=32  çıktısını verecek. 

int için konuuyor olursak a = 0 ise; 0 ile herhangi birşeyi & 'lediğimiz zaman 0 elde ediyor olacağız

int sıfır dışında birşeyse örneğimiz üzerinden gidelim 00110000 ile a - 1 den elde ettiğimiz   00101111 sayısını & 'leyerek (dikkat edin sıfırlamak istediğimiz bit'i -1 le zaten sıfır yapmış olduk bu noktada) nihai hedefimize  kolayca ulaşmış oluyoruz. Benden bir tavsiye floating point sayılar ile denemeyin bile :)

Herkese kolay gelsin.

Önceki konu : Bit Manipülasyonları

Sonraki konu : Tüm Bitleri Set Etme

Hiç yorum yok:

Yorum Gönder

Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...