Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
1 beğenilme 0 beğenilmeme
914 kez görüntülendi

Diyelim iki değişkeniniz var:

int a,b;

Programın çalışması sırasında bunlar bazı değerler alıyor. Ama programın bir yerinde, diyelim ki a'daki değeri b'ye, b'deki değeri a'ya yazmak istiyorsunuz. Bunun mesela bir yolu şu:

int c;

c=a;
a=b;
b=c;

Ama burada üçüncü bir değişken kullandık. Bunu kullanmadan a ve b nin değerlerini değiştirebilir misiniz?

Veri Bilimi kategorisinde (236 puan) tarafından  | 914 kez görüntülendi
$a=a+b$;

$b=a-b$;

$a=a-b$;
tatlı ,minik bir soru :)

bu yontem dogru olsa da sadece int tipinde olan degiskenlerde calisma garantisi var. Toplama ve cikarma yerine xor kullanirsaniz her turlu degisken icin kullanabilirsiniz

hocam XOR  bit operatöründen emin miyiz ?
evet XOR bit operatoru bu islem icin is gorur.
Operatörün işlevini biliyorumda,dümdüz bakınca kestirmek zor.Açıklama eklerseniz bence daha kaliteli cevap olur

$(a \bigoplus b )  \bigoplus c = a \bigoplus ( b \bigoplus c )$

$( a \bigoplus b ) = ( b \bigoplus a ) $

$a \bigoplus a = 0 $

$a \bigoplus 0 = a$

ilk basta elimizde $a$ ve $b$ var. $a$ yi $a \bigoplus b $ ye esitleyelim. Daha sonra $b$ yi $a \bigoplus b$ ye esitleyelim. yani $b=a \bigoplus b \bigoplus b = a$. Daha sonra $a$ yi yeniden $a \bigoplus b$ ye esitlersek (yada baska bir degisle $a \bigoplus b \bigoplus a$) elimize $b$ gelir.
C kodunda gostermek gerekirse

#include <stdlib.h>
#include <stdio.h>

void degistir(int* a, int* b)
{
  
    *a = *a ^ *b; // a = a xor b
    *b = *a ^ *b; // b = a xor b xor b = a
    *a = *a ^ *b; // a = a xor b xor a = b
}

int main(){
  float a = 3.14;
  float b = 2.71;
  
  printf("a : %f , b : %f \n",a,b);

  degistir((int*)&a,(int*)&b); // fonksiyonumuz int* bekliyor o yuzden ilk basta float olan
                               // degiskenimizin adresini & operatoru ile alip (int*) ile int* 
                               // tipine donusturuyoruz

  printf("a : %f , b : %f \n",a,b);
}

 

1 cevap

2 beğenilme 0 beğenilmeme
X := X XOR Y
Y := Y XOR X
X := X XOR Y

 

(1.6k puan) tarafından 
20,282 soru
21,821 cevap
73,503 yorum
2,526,886 kullanıcı