Kayıtlar

2022 tarihine ait yayınlar gösteriliyor

C++ Dersleri | Diziler - Dizilerin Başlatılması ( Array Initialization )

    C++ 'da bir dizi, yalnızca belirli bir değişken türü için sıralı şekilde bellekte yer almasını sağlayan veri bloğudur. C++ 'da bir değişkeni tanımlarken geçerli olan tüm kurallar geçerlidir. Ek olarak bir diziden bahsettiğimiz için, bu veri tipinden bellekte kaç adet saklayacağımızı belirtmemiz gerekir. Bunun için değişken ismine köşeli parantez [] içerisine adedi yazarız.     Aşağıda int değişken tipi için adı arrInts olan ve 3 elemana sahip olduğu söylenen bir tanımlama görüyoruz : int   arrInts [ 3 ];     Bir dizi tanımlanırken eleman değerleri de verilebilir, buna literatürde initialization deniyor, başlatma olarak çevrilmiş, bunun sebebi bir değişkeni sadece tanımlarsanız sadece tanımlamış olursunuz, değerini vermezseniz başlatmış olmazsınız :) ya compiler kafasına göre bir değer verir ya da vermez sadece adresi ve sığası biliyor olur ve o anda bellekte o adreste ne veri varsa onun veri tipindeki karşılığını görüyor olursunuz, kararsız bir yapıdan bahsediyoruz yani. T

C++ Dersleri | C++ Diziler [ Array ]

    C++ 'da d iziler, aynı veri tipine sahip adetli verilerin tek bir değişken ismiyle erişilebilir hale gelmesine olanak tanır. Ne diyebiliriz; ADC 'den veri okuyoruz, saniyede 100 örnek alacağız, her biri için adcVal1, adcVal2 .. adcVal100 diye yüz adet değişken tanımlayıp her birine verimizi kaydedebiliriz, çok pratik olmayacak gibi geldi bana ve de örnekleme sayımız parametrik ise bu yolu kullanmak zaten imkansız oluyor. Bu noktada dizilerden faydalanıyoruz. AdcVals diye bir dizi oluşturup, boyutunu belirtip hafızada bizim için o veri tipinin yüz adedinin sığabileceği bir bellek alanı ayırmasını söylüyoruz, verilerimizi onun içinde saklayıp yine oradan erişebiliyoruz.     C++ da bir diziyi her değişkende olduğu gibi önce tanımlamak "declare" sonrasında da dilersek başlatmak "initialize" gerekiyor. Sabit değerli diziler için dizi boyutunu da belirtmek gerekiyor ki hafıza organizasyonu işlevi düzgün görevini yerine getirebilsin. Sabit değerli diye ba

C++ Dersleri | Bit Alanları - Gömülü Sistemler Bellek Organizasyonu

Resim
     Gömülü sistemlerde hepimizin bildiği ya da şuanda öğreneceği üzere hafıza alanlarımız (flash - eprom - ram) oldukça kısıtlıdır. Atmega 328p için 2kb ram alanı var desek ve bunun da ancak 2048 tane harfi ram de barındırabileceği anlamına geldiğini söylesek, belki de şu okumakta olduğunuz metini bile ram de saklayamıyor olacağımızı kolayca tahmin edebiliriz. Bazı durumlarda herhangi bir parametrenin sadece açık ya da kapalı olduğunu tutmak istediğimiz bir değişkene ihtiyacımız olur. Ancak en küçük hafıza birimimiz 8 bit (1byte) olduğundan, 1 byte harcamadan 1 bitlik veriyi bir değişken içerisinde saklayabilmek mümkün değildir. Ancak bu bir byte 'ın geri kalan 7 bitini farklı değişkenler için kullanmamıza olanak tanıyan bit fields dediğimiz bir yapı vardır. Tanımlarken hangi değişken için kaç bitlik alan ayırmak istediğimizi belirtmemiz yeterli, bit ayırma işlemini compiler halleder.           Bir projede parametreleri kaydetmek isteyelim, hatta daha net olarak örneklendirelim,

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

 C++ dersleri bit işlemlerinde bit kopyala 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 olara

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,

C++ Dersleri | Bit işlemleri - Bir Tamsayının 2'nin Kuvveti Olup Olmadığının Kontrol Edilmesi

 C++ dersleri bit işlemlerinde bir tam sayının 2 'nin kuvvetlerinden olup olmadığını kontrol edebilmek için bitwise operatörlerinden faydalanıyoruz : int   main () { int   number   =   128 ; bool   isPowerOfTwo   =   number   &&   !( number   &   ( number   -   1 )); cout   <<   " result= "   <<   isPowerOfTwo   <<   endl ; }  result=1  dikkat edilirse en sağdaki set biti resetleme konusuna, konunun genelinde ihtiyaç duyuluyor. Adım adım inceleyelim neler oluyor :  128 : 1000 0000b en sağdaki set biti clear yaptığımız zaman değerimiz 0 oldu, yani false, başında ! not operatörü var bu da && operatörünün sağ tarafını true yaptı, sol tarafta da number 0 olmaması sebebiyle true döndürüyor, true && true sonucunda true dönmüş oluyor. 127 olsaydı değerimiz : 127 : 0111 1111b olacaktı, en sağdaki set biti clear yapınca : 0111 1110b ye dönüyor değerimiz : bu da true olarak değerlendirilir, başındaki not ! ile false

C++ Dersleri | Bit İşlemleri - Set Bitleri sayma

 C++ bit işlemlerinde bir bit dizesi içerisindeki SET (1) olmuş bitlerin sayısını elde etmek için bir kaç yol izleyebiliriz, basitçe programlama kafasıyla for kullanarak yapılabilir : int   main () { unsigned   int   a   =   1234 ;       // 0100 1101 0010 int   bitCount   =   0 ; for   ( bitCount   =   0 ;   a ;   a   >>=   1 ) bitCount   +=   a   &   1LL ; cout   <<   " result= "   <<   bitCount   <<   endl ; }  result=5  ne yapmış olduk açıklamaya çalışamadan önce for ne yapıyor onu anlatalım : for 'un ilk ifadesi bir kez çalıştırılır, ikinci ifadesi kontrol edilecek durumu belirler; burada yalnızca a var, bu ne anlama geliyor, bu ifade boolean bir ifade olmalıdır, 0 olmamışsa durumun sağlandığını kabul eder yani 3 5 7 vs diğer tüm sayılar true kabul edilir, yani for 'un bitme şartı a nın sıfır olması durumudur, en son ifadesi de her dönüşte yürütülecek kod ifadesidir, for'u yazmadan for'u da anlatmış olduk kıs

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 = 10 1 01010 değerini   a >> 5 : 0000010 1 : 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ğı

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

 C++ Dersleri | Bit İşlemleri - Bit Toggle; kısaca açıklamak gerekirse bir bit dizesinin istenen bitini toggle etmek, mevcut değerini ters çevirmek anlamına gelir, yani 0 ise 1, 1 ise 0 a çevirir. int   main () { int   a   =   255 ;       // 11111111 a   ^=   1LL   <<   7 ;    // 01111111 127 cout   <<   " a= "   <<   a   <<   endl ;    } a değişkeninin 7 bitini toggle yap demiş olduk, işlemi adım adım yazmamız gerekirse a 255 değerindeyken 8 bit, hepsi 1 şeklinde değer buluyor ikili sistemde -> 11111111 bu değeri (1 << 7) ile -> 10000000 xor işlemine tabii tutarsak 01111111 elde etmiş oluyoruz. Önceki konu :  Tüm Bitleri Set Etme Sonraki konu : Bit Kontrol

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 gels

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: 001 1 0000 ş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: 001 0 0000 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ı

C++ Dersleri | Bit Manipülasyonları

Resim
     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 bilmiyor

C++ Dersleri | Bitwise Operatörleri | Right Shift Operatör

 C++ bitwise operatörlerden right shift operatörünü konu alıyoruz >> . Right shift operatörü,   C++ Dersleri | Bitwise Operatörleri | Left Shift Operatör konusunda bahsettiğimiz tüm özellikleri taşıyor, tek farkla : bit dizisini sağa doğru kaydırıyor. Bir örnekle right shift operatörünün nasıl kullanıldığına bakalım: int   main () { int   a   =   2 ; // 0010b int   b   =   a   >>   1 ; // 0001b cout   <<   " a= "   <<   a   <<   " , b= "   <<   b ; } çıktımız şu şekilde :  a=2, b=1  Kolayca anlayabileceğimiz şekilde a değişkeni için oluşan binary sistem diziliminde indexlemeye göre 1. bit hanesinde yer alan operatöre gönderdiğimiz sayı :1 adedince sağ tarafa kaydırılmış. Left Shift operatörü için sayıyı 2 'nin kuvvetleriyle çarpmakla aynı şey demiştik, burada olan da sayıyı 2 'nin kuvvetleriyle bölmekle aynı şeydir. a değişkeninin değeri olan 2 'yi 2^1 'e (bu 1 operatöre gönderilen 1) bölerek 1 eld

C++ Dersleri | Bitwise Operatörleri | Left Shift Operatör

Resim
 C++ bitwise operatörlerinden left shift << operatörüne gelmiş bulunmaktayız, adından da anlaşılabileceği üzere binary düzendeki bir değişkeni  MSB (most significant bit) tarafından kayıplarla LSB (least significant bit) tarafından yeni eklemelerde düzenleyen bir operatördür, ne demek istiyorum bir örnekle açıklamaya çalışalım: int   main () { int   a   =   4 ; //0100 int   b   =   a   <<   1 ; //1000 cout   <<   " a= "   <<   a   <<   " , b= "   <<   b   <<   endl ; } şöyle bir çıktıya ulaştık :  a=4, b=8  burada olan; indekse göre konuşacak olursam, a değişkeninin 2. bitinde yer alan 1 değeri, 1 bit sola kaydırılmış oldu. Olayı bu kadar basit olmakla beraber dikkat edilmesi gereken noktalarımız vardır; ilk dikkat etmemiz gereken şey değişkenin boyutu, int yukarıdaki kod için benim sistemimde 4 bytes. Bu da şu anlama gelir 4bytes * 8 bit 'ten 32 bitlik bir değişkenimiz var demektir,  ve bu 32 bitlik de

C++ Dersleri | Bit işlemleri - Bitwise And ~ C++ ve operatörü &

Resim
 C++ bitwise and (ve operatörü) & , dijital elektronikten bildiğimiz ve kapısıyla aynı mantıkla çalışmaktadır, iki operandı bulunup, her iki operand da doğru ise doğru (true) sonucunu üretir, diğer tüm olaslıklarda yanlış (false) sonucunu üretir. C++ ve operatörü için doğruluk tablosunu bir görsel ile paylaşalım : kodlarken de aynı isimdeki değişkenleri kullanalım: int   main () { int   a   =   7 ; //0111 int   b   =   13 ; //1101 int   aANDb   =   a   &   b ; //0101 cout   <<   " a= "   <<   a   <<   " , b= "   <<   b   <<   " , a&b= "   <<   aANDb ; } programın çıktısı şu şekilde :   a=7, b=13, a&b=5  Sonuç olarak 5 elde ettik, C++ 'ın bu hesaplamayı nasıl yaptığını alttaki görselde açıklamaya çalıştım: Her sütunu kendi içinde and işlemine tabi tutup aynı haneye cevap olarak döndürüyor. Bu operatörün kendi başına değişkenin değerinde bir değişiklik yapmadığını unutmayın,

C++ Dersleri | Bit İşlemleri | Bitwise XOR, Özel Veya Operatörü

Resim
 C++ bitwise Xor (exclusive or operator) operatörü ^ , diğer bit operatörleri gibi dijital elektronik xor yapısıyla aynıdır. Doğruluk tablosunu yine görselde paylaşalım : kodlarken de aynı değişkenleri kullanalım: int   main () { int   a   =   7 ; //0111 int   b   =   13 ; //1101 int   aXORb   =   a   ^   b ;           //1010 cout   <<   " a=  "   <<   a   <<   " , b= "   <<   b   <<   " , a^b= "   <<   aXORb ; } çıktımız :  a= 7, b=13, a^b=10 10 elde ettik, binary formatındaki sayıları alt alta yazarak soldan sağa doğru sütunları XOR işlemine tabi tutuyoruz en solda: 0 ^ 1 den 1 geldi, bir sonrakinden 1 ^ 1 den 0 geldi, bir sonrakinden : 1 ^ 0 dan 1 geldi, bir sonrakinden  1 ^ 1 den 0 geldi. Benim xor anlatırken akılda kalması için anlattığım bir hikaye var, patron sekreterine bana yalnızca bir kişi çağır demiştir. Kimse gelmezse patron bu işi sevmez. Ahmet gelirse patron için tamamdır, Me