İki sayıyı birbiri ile birleştirme

Başlatan AST, 17 Şubat 2015, 23:42:49

AST

a=12435;
b=67890;


bu iki sayıyı c= 1234567890; şeklinde birleştirmek istiyorum.En kolay şekilde nasıl yapabilirim.

MrDarK

Sayıların hex olduğunu düşünürsek ;

ve 65535'i veçmediğini varsayarsak;

uint16_t a = 12345;
uint16_t b = 67890;
uint32_t sonuc;

sonuc =  a;
sonuc = sonuc <<16;
sonuc += b;
Picproje Eğitim Gönüllüleri ~ MrDarK

AST

Değerler tam sayı olacak.

int a=12345;
int b=67890;

esensoy

uint16_t a = 12345;
uint16_t b = 67890;
uint32_t sonuc;

sonuc = (a*100000)+b;
En tehlikeli an "zafer" anıdır.

RaMu

Kullandığın derleyicide hazır fonksiyonuda olabilir,
uint32_t sonuc;
sonuc=make32(a,b);
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Kabil ATICI

uint16_t b = 67890;
bu olmaz. en büyük sayı 65535 olabilir.
ambar7

AST

Alıntı yapılan: esensoy - 18 Şubat 2015, 00:15:49
uint16_t a = 12345;
uint16_t b = 67890;
uint32_t sonuc;

sonuc = (a*100000)+b;

Burada değişkenleri 32bit yaptığımızda sıkıntı yok.Fakat değişkenlerin basamak değerleri değiştiğinde yani,
uint32_t a = 123;
uint32_t b = 678;
uint32_t sonuc;

olduğunda sonuc farklı çıkıyor.Amaç a  ve b'nin peşpeşe eklenmesi.

Kabil ATICI

#7
if (b<10)
sonuc=(a*10)+b;
else if ((b<100) && (b>9))
sonuc=(a*100)+b;
else if ((b<1000) && (b>99))
...


devamını da sen getir.
ambar7

Tagli

Aslında programcı açısından bakıldığında en kolayı bu sayıları yazıya çevirip uç uca eklemek ondan sonra da tekrar sayıya çevirmek. Ancak bu performans açısından iyi bir yaklaşım olmaz.
Gökçe Tağlıoğlu

fatih6761

#9
Bu birleştirme sonucu elde edilecek sayının ne için kullanılacağını söyleseniz işler epey bir kolaylaşacak.
Ama sonucun sayı olarak kullanılacağını düşünürsek verilenlere ek olarak şöyle bir şeyler karalanabilir:
uint32_t integer_concat(uint16_t a, uint16_t b)
{
	uint16_t c = b, n = 1;
	while (c > 0)
	{
		c /= 10;
		n *= 10;
	}
	
	return (a * n) + b;
}


AST

İki adet random sayı üretip alıcıya gönderiyorum.Elimdeki random fonksiyonu maksimum 0x7FFF  değerini üretiyor.Bu değeri yükseltmem gerekiyordu.

Alıntı yapılan: fatih6761 - 18 Şubat 2015, 10:05:32

uint32_t integer_concat(uint16_t a, uint16_t b)
{
	uint16_t c = b, n = 1;
	while (c > 0)
	{
		c /= 10;
		n *= 10;
	}
	
	return (a * n) + b;
}



bu fonksiyon iş görüyor.

fatih6761

#11
O halde istediğiniz veri büyüklüğünde bir random number generator yazmak daha performanslı ve daha güvenli olur.

Not: Random sayılar üretmek istediğinize göre verdiğim fonksiyonu 10luk tabanda kullanmak zorunda değilsiniz.

uint32_t integer_concat(uint16_t a, uint16_t b)
{
    uint16_t c = b, n = 0;
    while (c > 0)
    {
        c >>= 1;
        n++;
    }
    
    return (a << n) | b;
}


Bu şekilde sayıları ikilik tabanda düşünerek daha hızlı olur.
123 + 345 = 123345 değil de
1111011 + 101011001 = 1111011101011001
şeklinde aynı sonucu vermez ama daha hızlı olur, nasıl olsa veri random olacak.

ercan_t

uint32_t a = 123;
uint32_t b = 678;
uint32_t sonuc;

char tmp[50];
sprintf(tmp,"%d%d",a,b);
sscanf(tmp,"%d",&sonuc);


ok?

AST

Alıntı yapılan: fatih6761 - 18 Şubat 2015, 11:31:03
O halde istediğiniz veri büyüklüğünde bir random number generator yazmak daha performanslı ve daha güvenli olur.
Herhalde bu şekilde yapmak en iyi yöntem olacak.

@ercan_t printf kullanamam flash sıkıntısı var.

Amenofis

Sanırım 32 bit rastgele sayı üretmek istiyorsunuz. Neden basitçe;

uint32_t sayi = rand();
sayi = sayi << 16 | rand();

şeklinde yapmıyorsunuz?

Ayrıca seed olarak o anki rastgele sram değerini kullanabilirsiniz. Böylece her seferinde sayılar farklı olacaktır. Derleyiciniz gcc ise;

uint16_t seed __attribute__ ((section (".noinit")));
int main()
{
srand(seed);
...