Toggle işlemi ( x ^= 1 << 1; )

Başlatan baran123, 22 Haziran 2015, 23:09:28

baran123

Çok basit ama ne yaptığını unuttum.:) Notlarımda kayıp.

Bir değişkenimiz olsun.Unsigned int ve 8 bitlik.
uint8_t x = 0;

Bu işleme tabi tuttuk.Yani ne yapmış olduk buna ? Detaylı şekilde söyleyebilirseniz çok süper olur. :)
x ^= 1 << 1;

Bu amca ne yapıyor da x toggle oluyor ?
Hatta şöyle açıklarsak daha makbule geçer;
x ^= a << b;


Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Hocam işlem önceliğini karıştırdım.Şu yazım mı doğru diğeri mi ?
( (x ^= a) << b );
( x ^= (a << b) );



Gökhan BEKEN

#3
Öncelikle "uint8_t" kullanmak yerine ben "unsigned char" kullanmanı tavsiye ederim çünkü "uint8_t" kullanımı ANSI C standartında yok.

ikinci konu kaydırma komutu...


mesela bir sayının diğer bitlerini bozmadan sadece belli bir bitini değiştirelim.

void BitToggle(unsigned char sayi, char bit);
unsigned char sayi = 0xAC; // 0xAC=0b10101100
sayi = BitToggle(sayi,3); //sayının 3. bitini toggle yap ve çıkan sonucu sayıya yaz

void BitToggle(unsigned char sayi, char bit){
  
        if(((sayi)&(1<<bit))-(1<<bit)==0){ // ilgili bit bir ise
            sayi&=~(1<<bit); // ilgili biti sıfır yap
        }else{ // ilgili bit sıfır ise
            sayi|=(1<<bit); // ilgili biti bir yap
        }

        return sayi;
}


yukarıdaki örnek, if'lerden dolayı uzun bir yöntem sayılır, burdaki yöntem ise daha kısa:

void BitToggle(unsigned char sayi, char bit);
unsigned char sayi = 0xAC; // 0xAC=0b10101100
sayi = BitToggle(sayi,3); //sayının 3. bitini toggle yap ve çıkan sonucu sayıya yaz

void BitToggle(unsigned char sayi, char bit){
        sayi ^= (1<<bit);    
        return sayi;
}


yukarıdaki kodda, önemli olan satır sayi ^= (1<<bit);     satırıdır.
bu satırı inceleyelim:
bit değişkeninin değeri 5 ise
sayi ^= (1<<5);   işleminin açılımı şu olur: sayi ^= 0b00100000;
sayi ^= 0b00100000;  işleminin açılımı ise sayi değişkeninin değeri 0xAC olduğundan dolayı şu olur:  0b10101100 ^= 0b00100000;

xor işleminin sonucu:
0b10101100
0b00100000
-----------------
0b10001100 olur, yani görüldüğü gibi sadece 5.bit terslenmiş oldu.






mesaj birleştirme:: 23 Haziran 2015, 01:35:35

Not: işlemleri ezbere yaptım ve deneme yapmadım(üstteki resim dışında), yanlışım olduysa affola.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Estağfurullah hocam ben yine bir denerim.Not edeip bir iki örnek yapayım.Çok çok teşekkürler. :)

Klein

Alıntı yapılan: Gökhan BEKEN - 23 Haziran 2015, 01:34:06
Öncelikle "uint8_t" kullanmak yerine ben "unsigned char" kullanmanı tavsiye ederim çünkü "uint8_t" kullanımı ANSI C standartında yok.
Aksine Msra-C yönergeleri  "uint8_t" şeklinde kullanılmasını tavsiye ediyor.

Alıntı Yap
Rule 6.3 (advisory):
typedefs
that indicate size and signedness should be used in place
of the basic numerical types.
The  basic  numerical  types  of
signed
  and
unsigned
  variants  of
char
,
int
,
short
,
long
  and
float
,
double
should not be used, but specific-length
typedefs
should be used. Rule 6.3 helps to clarify
the size of the storage, but does not guarantee portability because of the asymmetric behaviour of
integral promotion. See discussion of integral promotion — section 6.10. It is still important to
understand the integer size of the implementation.
Programmers should be aware of the actual implementation of the
typedefs
under these definitions.
For example, the ISO (POSIX)
typedefs
as shown below are recommended and are used for all basic
numerical and character types in this document. For a 32-bit integer machine, these are as follows:
typedef          char   char_t;
typedef signed   char   int8_t;
typedef signed   short  int16_t;
typedef signed   int    int32_t;
typedef signed   long   int64_t;
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
typedef unsigned long   uint64_t;
typedef          float  float32_t;
typedef          double float64_t;
typedef long     double float128_t;

mufitsozen

#6
uint8_t (ve digerleri) stdint.h'da tanimlanir.
Alıntı Yap...ANSI C standard committee, for the C99 standard, specified the inclusion of a new standard include file called stdint.h   .....
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

neden tavsiye ediyor ? herikiside 8bit değilmi

Gökhan BEKEN

#8
Başka bir projeden, fonksiyonları kopyala/yapıştır yaptığımda, derleyici "int8_t" geçen yeri tanımıyor. Ya tek tek klasik şekilde tanımlıyorum, ya da çok fazla yerde geçiyorsa, türleri yeniden tanımlıyorum. Oysa buna ne gerek vardı, klasik usul ile tanımlanmış olsa hiç uğraşmayacaktım.

Bu arada stdint.h dosyasını bilmiyordum, teşekkürler. Ama yinede bu değişken adlarını sevemedim, eski usul devam edeceğim.
Özel mesaj okumuyorum, lütfen göndermeyin.

mufitsozen

#9
Alıntı yapılan: Gökhan BEKEN - 23 Haziran 2015, 11:45:07
Bu arada stdint.h dosyasını bilmiyordum, teşekkürler. Ama yinede bu değişken adlarını sevemedim, eski usul devam edeceğim.

Yav ben hep diyom zaten bu MISRA kim! ANSI C99 komitesi nasil ve neden boyle akil verip herkesin nasil yapacagina karar veriyor!

Butun bunlar cok manidar, durmadan yeni icatlar cikarip bizim kendilerini gecmemizi onlemek icin yapiyorlar. Belkide sizin blog sitenizi gorup "ooo bu arkadas cok tehlikeli, bize rakip olabilir!" diye dusunmusde olablirler!   :P

Siz genc ve daha bilgilisiniz. Ben bu yasta sahip oldugum kiytirik bilgiyle onlarla mucadele etmeye cesaret edemiyorum, ugrasacak enerjimde yok zaten. Standard'da ne yazarsa yapiyorum, basim agrimiyor.

Size bol sans, iyiki kendi isinizden para kazaniyorsunuz Ford, Mercedes, Bmw, Audi, Honda, Toyota gibi firmalara sw yazmiyorsunuz yoksa bunlar sizinle isyerinizde de ugrasirdi. Bizim standardimiz boyle, yada MISRA kurallarina uygun olmazsa kabul etmeyiz filan derlerdi netekim. Ondan sonra ugras dur adamlari yola getirecegim diye..
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Gökhan BEKEN

MISRA C anlattınız da dizinizin dibine oturmadık mı hocam. Türkçe hiç bir yerde kaynak bulamamıştım yakın zaman önce. Ben de daha fazla zorlamadım.
Özel mesaj okumuyorum, lütfen göndermeyin.

mufitsozen

#11
Alıntı yapılan: Gökhan BEKEN - 23 Haziran 2015, 12:28:08
MISRA C anlattınız da dizinizin dibine oturmadık mı hocam. Türkçe hiç bir yerde kaynak bulamamıştım yakın zaman önce. Ben de daha fazla zorlamadım.

Bak ne kadar dogru soyluyorsun.

Ben bu yuzden anam ile rahmetli babamin hakkini odeyemem.

Anacigim ben yeni dogdugumda kucagina almis, kulagima ilk olarak "MISRA, MISRA!" demis. Babam da iskillenmis! "hanim hanim kim bu misra?" demis(acaba yuzkitabindan birinimi buldu dogumevinde yatarken diye, tabii o zamanlar facebook yok, arkadas ararken mektup yazip hademe yada hemsireyle yollaniyor. sonra adina yuzkitabi denen bir ciltli deftere yapistiriliyor.

Neyse Annemde Babama "Benim oglum bilgisayar muhendisi olacak, seneye ODTU diye bir universite kurulacak, oglum oraya gidecek, bilgisayar ogrenecek icat edildiginde!" demis, Babam nerden biliyon diye sorunca "ooole bir elenktrink aldim" diye cevap vermis!

Rahmetli babamda 1986da hakkin rahmetine kavustu ve MISRAyi goremedi ama bana vasiyet etti, oglum bu MISRA cok onemli sakin ogrenmemizlik etme, hakkimi helal etmem dedi"

Bende "Baba yav Ankarada oxford'mu var, MITmi var nerde ogrenecem bu MISRA'yi dedim, oglum Internet diye birsey icat edilecek, orda Amazon diye bir yer olacak, ordan kitap alirsin, yada warezden korsanlama indirirsin"dedi.

Hala mutesekkirim onlara beni boyle yetistirdikleri icin...

iste boyle.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Karamel

Gokhan hocam. Turkce arayarak harcanan zaman ve energy ile ingilizce ogrenmeniz daha mantikli olur diye dusunmekteyim :-X

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.