folder Tahribat.com Forumları
linefolder C - C++
linefolder Xor Swap Algoritması



Xor Swap Algoritması

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    Bu algoritmanın amacı 2 değişkenin değerlerini geçici değişken kullanmadan değiştirmek.

    Basit bi örnek:

    #include <iostream>
    using namespace std;
    
    void xorSwap (int *x, int *y) 
    {
        if (x != y) 
    	{
             *x ^= *y;
             *y ^= *x;
             *x ^= *y;
        }
    }
    
    int main()
    {
    int a= 5,b=3;
    xorSwap(&a,&b);
    cout<<"a: "<<a<<endl<<"b: "<<b<<endl;
    return 0;
    }

    Daha fazla bilgi için;

    http://en.wikipedia.org/wiki/XOR_swap_algorithm 


    :)
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Oha yeni gördüm . İlginçmiş. Örneklendirirsek

     

    x=1001

    y=1111 ise

    x^=y => x=x^y dir... Yani x= 0110

    şimdi sıra

    y^=x => y=y^x dir... Yani y = 1001

    şimdi son olarak x^=y  =>    X= 1111 olur ki algoritmayı uygulamalı denemiş olduk ve çalıştığını görüyorum. Güzelmiş vallaha bunu unutmayayım. Attım kafaya, Beyin bedavah yaaah!!!

    DrKill tarafından 24/Ara/12 03:05 tarihinde düzenlenmiştir

    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    Konuyu baltalamak gibi olmasın da http://en.wikipedia.org/wiki/XOR_linked_list böyle manyak bir şey de var:D


    Olaylara karışmayın!
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    kitaptan ilerlerken şöyle bişeye denk geldim : "Write a preprocessor macro that swaps two integers. (If you're a real hacker, write one that does not use a temporary variable declared outside the macro.)" bunu ararken buldum bu algoritmayı, belleğin kısıtlı olduğu durumlarda kullanılırmış.

    @yeniharman: adamlar tek pointerda iki bellek adresi tutmuşlar :D o daha fenaymış :D

    wasd tarafından 24/Ara/12 03:18 tarihinde düzenlenmiştir

    :)
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nick6
    0x656e
    0x656e's avatar
    Kayıt Tarihi: 19/Mayıs/2012
    Homo

    bunlar hangi matematikten amk ben 4le 4 ü zor topluyorum:(

  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek

    Heh, merak edenler için söyliyim xor şifrelemenin en temel işlemidir.  a yı b ile xorlamak, bi anlamda a yı b ile şifrelemek diyebiliriz çünkü sonuca yine b anahtarını uygularsanız a yı elde edersiniz. sayılar ne olursa olsn overflow da olmaz.

    Bitwise operatörlerle ilgili bir tane soru sorayım.

    Bir sayıyı 8 le nasıl çarparsınız?

     


    Nush ile uslanmayanı etmeli tekdir, Tekdir ile uslanmayanın hakkı kötektir!
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    OFree
    OFree's avatar
    Kayıt Tarihi: 25/Temmuz/2010
    Erkek
    DrKill bunu yazdı

    Oha yeni gördüm . İlginçmiş. Örneklendirirsek

     

    x=1001

    y=1111 ise

    x^=y => x=x^y dir... Yani x= 0110

    şimdi sıra

    y^=x => y=y^x dir... Yani y = 1001

    şimdi son olarak x^=y  =>    X= 1111 olur ki algoritmayı uygulamalı denemiş olduk ve çalıştığını görüyorum. Güzelmiş vallaha bunu unutmayayım. Attım kafaya, Beyin bedavah yaaah!!!

    wayy iyimiş harbiden yukardaki uygulamadan fazla anlamadıgım icin ornekle birdeki yukardakiyle tam oturdu harbi fena :D uzun şifrelere bi kaç hamle deha yaptınmı tmmdir :Dasdasd


    Freedoom is not free.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    g2k
    g2k's avatar
    Kayıt Tarihi: 03/Mayıs/2007
    Erkek
    HolyOne bunu yazdı

    Heh, merak edenler için söyliyim xor şifrelemenin en temel işlemidir.  a yı b ile xorlamak, bi anlamda a yı b ile şifrelemek diyebiliriz çünkü sonuca yine b anahtarını uygularsanız a yı elde edersiniz. sayılar ne olursa olsn overflow da olmaz.

    Bitwise operatörlerle ilgili bir tane soru sorayım.

    Bir sayıyı 8 le nasıl çarparsınız?

     

    3 defa sola öteleyerek mi ?

  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    HolyOne bunu yazdı

    Heh, merak edenler için söyliyim xor şifrelemenin en temel işlemidir.  a yı b ile xorlamak, bi anlamda a yı b ile şifrelemek diyebiliriz çünkü sonuca yine b anahtarını uygularsanız a yı elde edersiniz. sayılar ne olursa olsn overflow da olmaz.

    Bitwise operatörlerle ilgili bir tane soru sorayım.

    Bir sayıyı 8 le nasıl çarparsınız?

     

    2lik tabandaki değerini 3bit sola kaydırarak (benden önce yazılmış :F)

    sayi<<3 şeklindeydi sanırım

    wasd tarafından 17/Oca/13 03:12 tarihinde düzenlenmiştir

    :)
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    Ben de mantığı açıklayayım bari:)

    Onluk sistemi düşünelim önce. Sayımız 12345 olsun, bu sayıyı on ile çarpmak istesek en sağına bir sıfır koyuyoruz. Makinecesi bir kere sola kaydırıyoruz. Matematiksel temel

    12345 = (5 * 10 ^ 0) + (4 * 10 ^ 1) + (3 * 10 ^ 2) + (2 * 10 ^ 3) + (1 * 40 ^ 4)

    sayıyı 10 ile çarpalım:

    123450 =   (5 * 10 ^ (0 + 1) ) + (4 * 10 ^  (1 + 1) ) + (3 * 10 ^  (2 + 1) ) + (2 * 10 ^  (3 + 1) ) + (1 * 40 ^  (4 + 1) ) 

    Daha açık ifadeyle 10'nun kuvvetini 1 arttırıyoruz. Burada dikkat etmemiz gereken nokta 10'un kuvvetinin bir arttığı. En önemlisi ise onluk taban ve çarpacağımız sayının (10) eşit olduğu. Eğer 100 (10^2) ile çarpmak istesek 10'un kuvvetleri 2, 1000 (10^3) ile ise 3 ,... , 10...0 (10 ^ n) ile ise n kadar arttıracaktık.

    Şimdi ikilik tabanda bir sayı yazalım ve bu sefer iki ile çarpalım:

    101(2) = (1 * 2 ^ 0) + (0 * 2 ^ 1) + ( 1 * 2 ^ 2).

    101(2) x 2 = 1010(2)

    1010(2) =  (1 * 2 ^ (0+1)) + (0 * 2 ^ (1+1)) + ( 1 * 2 ^ (2+1)). 

    Bu sefer çarpacağımız sayı 2 ve tabanımız 2. Onluk tabandaki işlemler burada da geçerli. 4 ( 2^2) ile çarpmak istesek 2'nin kuvvetlerini 2 ile, 8 (2^3) ile çarpmak istesek 3 ile çarpacağız. Yani sayıyı sola doğru 1 bit kaydırıp boşlukları 0 ile dolduracağız. Bu durum bölme işleminde de geçerlidir. Yalnız bu şekilde bölme yapıyorsak kullandığımız veritipi önemli:)


    Olaylara karışmayın!
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cnr437
    cnr437's avatar
    Banlanmış Üye
    Kayıt Tarihi: 03/Nisan/2007
    Erkek

    Python ile,

    a, b = b, a


    Bizim olduğumuz her yerde herşey bizim yüzümüzden olmuştur. Ben benim amk bana bişey olmasın!
Toplam Hit: 1676 Toplam Mesaj: 11