Bit manipülasyonları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Bit manipülasyonları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

C++ Dersleri | Bit İşlemleri - Bit Kopyalama

 C++ dersleri bit işlemlerinde bit kopyalama konusundayız, bit kopyalamaktan kastımız nedir bir kaynak bitimiz var onun değerini alıyoruz, hedef bitimize yazıyoruz : 0 ise 0, 1 ise 1:

int main()
{
	int source = 5;
	int target = 3;
	int number = 0b00100100; // 36
	number ^= (-source ^ number) & (1LL << target); // 0010 1100
	// target bitini source bitiyle aynı yapar.
	
	cout << "result=" << number << endl;
}

 result=44  çıktısını alıyoruz.

işlem yapacağımız değer 36 'ydı 5. bitin değerini 3. bite yazınca 44 olmuş oldu. Sırasıyla işlemlerimize bakmamız gerekirse: değişenlerin değerlerini yerine yazarak devam edelim : 

number = 36 ^  (-5 ^ 36) & (1 <<  3);

1 << 3 : 0000 1000b değerini elde ettik,

-5 ^ 36 : 1111 1011 ^ 0010 0100 -> 1101 1111b elde ettik,

bu iki değeri & liyoruz : 0000 1000b & 1101 1111b -> 0000 1000 elde ettik,

son olarak da 36 ile üst satırda elde ettiğimiz değeri Xor luyoruz:

0010 0100b ^ 0000 1000 -> 0010 1100 değeri de 44 e eşit

finalde olan 36 : 0010 0100b     0010 1100b 5. indekste olan biti 2. indekse yazdırmış olduk.

Herkese kolay gelsin!


Önceki konu :  C/C++ Bit Set ve Bit Clear

Sonraki konu : Bit Alanları - Gömülü Sistemler Bellek Organizasyonu


C++ Dersleri | Bit İşlemleri - Tüm Bitleri Set Etme

 C++ ve gömülü sistemlerde bir değişkene ya da yazmaca ait tüm bitlerin set edilmesi çokça kolay bir mantığa dayanır. Eğer değişkenin ya da yazmacın boyutunu biliyorsak o kadar bit sayısına eşit olan en büyük sayıya eşitleyerek işin içinden sıyrılabiliriz: 8 bitlik bir yazmaç için 0xFF 'e eşitlemek bir çözüm olmakla beraber eğer bilmiyorsak bir fonksiyon içerisine template ile geliyorsa mesela daha basit bir yolu da söz konusu: değeri -1 e eşitlemek. 

uint8_t a = 0xFF;

    Yazının birinde bahsetmiştik, işaretli sayıların MSB biti (en solda) işaret biti olup 0 ise sayının pozitif 1 ise negatif olduğu anlamına geliyordu ve negatif tarafta anlamlı bitler 1 'ler değil 0'lardı. Ne demeye çalışıyorum ? 8 bit için konuşursak : -1 sayısı 2 lik sistemde 11111111b olarak ifade edilir, bence tüm bitleri set etmek için güzel yöntem :)

  PORTB = -1;

Tüm bitleri resetlemek istersek? Bilmem söylemeye gerek var mı ama yazmış olalım : a=0; işinizi çözecektir.

Herkese kolay gelsin!

Önceki konu : En Sağdaki Set Edilmiş Biti Resetleme

Sonraki konu : Bit Toggle

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

C++ Dersleri | Bit Manipülasyonları

    C++ bit işlemlerine devam ediyoruz, bit manipülasyonları çoğu zaman insanda yahu bunu nasıl yapıcaz diye kendisini sorgulatan bir his uyandırsa da öğrenildiğinde bu kadar basit miymiş yahu dedirtebilecek kadar da güçlü bir konudur :) Zevklidir demeden de geçmeyelim.

    Bir bit dizemiz olsa ve set edilmiş bitlerden en sağdakini tespit edip reset etmeniz istense, programcının kafası önce en sağdan başlayarak tek tek bitleri 0 mı 1 mi diye kontrol ettirip 0 ise ilerleyip 1 ise reset et ve orayı terk et diye bir kod yazmaya gidiyor, yok canım bu kadar zor olmamalı. Bu konuda bir çözüm önerisi olan cesur arkadaşım ileriki konularda yazdıklarımızı okumadan burada yorum olarak bizlere görüşünü bildirmeni şiddetle rica ediyoruz, farklı kafalardan farklı fikirler çıkar severim discussion ları.

Ya da tüm bitleri set etmemiz istense ? bu biraz daha görece basit geliyor, boyutu biliyorsak sorun yok mesela 8 bitlik bir dize için konuşuyorsak a = FF; der ve çıkarım işin içinden, ya bilmiyorsam? 😱

Bir bit dizesinin belirli bir bitini toggle etmek; toggle etmek ne demek? acaba; toggle etmek demek 1 ise 0, 0 ise 1 yapmak demek, ya da yine dize içerisindeki belirli bir biti kontrol etmek, set durumunda mı reset durumunda mı? ( set : 1 , reset : 0 olduğu anlamına gelir). Belki de bit dizesindeki set edilmiş bitlerin sayısını bilmemiz gerekecek, ya da reset durumdaki bitlerin sayısını. Ne derin konular. Yine belirli bir biti set etmek ya da clear etmek (sıfır yapmak). Yahut bir tam sayının 2 nin kuvveti olup olmadığını kontrol etmek? Bunlar masking işlemlerinde hayat kurtarıcı oluyor, bildiğimiz bitmask yahu, bilmiyor muyuz.. takipte kalın hepsini yazacak bu kardeşiniz size.

Son olarak da bitlerin yer değiştirmesine bakabiliriz: yani 3 bit in sayısal değerini 5. bitin sayısal değeriyle değiştirmek isteyebiliriz: 0100 1101 -> 0110 0101. 

Hepsini halledeceğiz merak etmeyin takipte kalın, kafanıza takılan herşeyi yorumlarda sormaktan lütfen çekinmeyin, blog yazmanın en güzel yolu, yazıları yeniden düzenleyebilmek sanırım. Youtube videoları için geçerli olmayan bu durum burada bizleri avantajlı hale getiriyor, yorumdan gelen bir soru üzerine ekleme çıkartma yapılabiliyor, haydi içeriklere siz de destekte bulunun :)


Şimdilik herkese kolay gelsin.

Önceki konu : Bitwise Operatörleri | Right Shift Operatör

Sonraki konu : Bit Manipulasyon - En Sağdaki Set Edilmiş Biti Resetleme

Video :



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...