Bit İşlemleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Bit İşlemleri 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 işlemleri, Bit Clear ve Bit Set

 C++ dersleri bit işlemlerinde belki de en çok kullandığımız bit işlemlerinden biri bit set diğeri de bit clear dir desek yanılmış olayız herhalde, bitwise OR konusunda örneğini vermiştik burda da kullanalım:

int indexOfBitToSet = 5;
PORTB |= 1LL << indexOfBitToSet;

5. indexteki bit 'i set eder. portB 'nin 5 numaralı pini Set edilmiş (HIGH) olur. Burada diğer pin konfigürasyonları bu durumdan etkilenmezler.

PORTB 'nin 0000 0000b olduğunu düşünelim,

1 << 5 bize 0010 0000b değerini verir, bu değerle 0000 0000b değeri orlanırsa, gayet basitçe 5. indexin 1 olduğunu görebiliyoruz.

Aynı şekilde bir bit dizesindeki belirli bir biti CLEAR (0) yapmak için bitwise and kullanıyoruz:

  int indexOfBitToClear = 5;
  PORTB &= ~(1LL << indexOfBitToClear);

şimdide PORTB 'nin tümünün HIGH olduğunu varsayalım, 1111 1111b, 1 << 5 'den 0010 0000b değeri gelir, ifadenin başında yer alan ~ işaretiyle bit dizisindeki tüm değerler inverse oldu, yani tüm 1 ler 0, tm sıfırlar 1 oldu -> 1101 1111, son olarak da PORTB nin değeri olan 1111 1111 ü 1101 1111 ile and işlemine tabi tuttuğumuz vakit, diğer hiçbir bit eklilenmeden sadece 5. intexteki bitin Clear olduğunu görebiliyoruz.

Herkese kolay gelsin!

Önceki konu : Set Bitleri sayma

Sonraki konu : Bit Kopyalama

C++ Dersleri | Bit işlemleri - Bit Kontrol

 C++ bit işlemlerinde bir bit dizesindeki belirli bir bitin durumunu kontrol etmek için değeri elde etmek istediğimiz bitin indeks değeri kadar right shift yapıp üzerinde and işlemi uygulayarak yapılabilir. Cümle şeklinde ifade edince bana bile anlaşılabilir gelmedi :) kodla bakalım :

int main()
{
	int a = 170;     // 10101010
	int result = (a >> 5) & 1LL;
	cout << "result=" << result << endl;  
}

 result = 5 

5. numaralı indexte yer alan bitin değerini sorguluyoruz, bu indexle kastettiğim sayma sayılarıyla değil, en sağdaki bit için 0 'dan başlayarak sayıyoruz anlamını ifade ediyor. Adım Adım şöyle gidiyor işlem :

a = 10101010 değerini   a >> 5 : 00000101 : yaptığımız zaman zaten istediğimiz bit en sağda yerini almış oluyor, bu değeri de 1 ile & işlemine tabi tutunca 1 ise 1, 0 ise döndürüyor result değişkenine. LL kullanmamızın sebebi Long Long deyip, değişkenin boyutundan bağımsız tüm veri tipleri için yapılacak işlemi garanti altına almaktır.

Şayet bitin değerine yerinde ihtiyacımız varsa; yani diğer tüm bitler 0 olacak, istediğimiz bitin değeri neyse yerinde o değer olacak, 5 için 00X00000 şeklinde

int main()
{
	int a = 170;     // 10101010
	int bitValueinPlace = a & (1LL << 5);
	cout << "result=" << bitValueinPlace << endl;
}

 result = 32 

5. biti 0 olan 218 gibi bir sayı kullansaydık; result=0 çıktısını elde etmiş olacaktık.

Kafanıza takılan herhangi birşey olursa lütfen yorumlarda sormaktan çekinmeyiniz.

Önceki konu : Bit toggle

Sonraki konu : Set Bitleri Sayma

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