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:
intmain(){intsource=5;inttarget=3;intnumber=0b00100100;// 36number^=(-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 :
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_ta = 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.
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 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 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 :)
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 :)