Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: AST - 17 Şubat 2015, 23:42:49

Başlık: İki sayıyı birbiri ile birleştirme
Gönderen: AST - 17 Şubat 2015, 23:42:49
a=12435;
b=67890;


bu iki sayıyı c= 1234567890; şeklinde birleştirmek istiyorum.En kolay şekilde nasıl yapabilirim.
Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: MrDarK - 17 Şubat 2015, 23:48:19
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;

Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: AST - 18 Şubat 2015, 00:02:43
Değerler tam sayı olacak.

int a=12345;
int b=67890;
Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: esensoy - 18 Şubat 2015, 00:15:49
uint16_t a = 12345;
uint16_t b = 67890;
uint32_t sonuc;

sonuc = (a*100000)+b;
Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: RaMu - 18 Şubat 2015, 03:11:45
Kullandığın derleyicide hazır fonksiyonuda olabilir,

uint32_t sonuc;
sonuc=make32(a,b);
Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: Kabil ATICI - 18 Şubat 2015, 07:25:39
uint16_t b = 67890;
bu olmaz. en büyük sayı 65535 olabilir.
Başlık: Ynt: İki sayıyı birbirine ekleme
Gönderen: AST - 18 Şubat 2015, 09:06:13
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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: Kabil ATICI - 18 Şubat 2015, 09:29:28
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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: Tagli - 18 Şubat 2015, 09:35:20
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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: fatih6761 - 18 Şubat 2015, 10:05:32
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;
}

Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: AST - 18 Şubat 2015, 10:54:12
İ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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: 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.

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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: ercan_t - 18 Şubat 2015, 12:24:30
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?
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: AST - 18 Şubat 2015, 14:34:38
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.
Başlık: Ynt: İki sayıyı birbiri ile birleştirme
Gönderen: Amenofis - 21 Şubat 2015, 23:11:41
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);
...