a=12435;
b=67890;
bu iki sayıyı c= 1234567890; şeklinde birleştirmek istiyorum.En kolay şekilde nasıl yapabilirim.
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;
Değerler tam sayı olacak.
int a=12345;
int b=67890;
uint16_t a = 12345;
uint16_t b = 67890;
uint32_t sonuc;
sonuc = (a*100000)+b;
Kullandığın derleyicide hazır fonksiyonuda olabilir,
uint32_t sonuc;
sonuc=make32(a,b);
uint16_t b = 67890;
bu olmaz. en büyük sayı 65535 olabilir.
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.
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.
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.
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;
}
İ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.
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.
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?
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.
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);
...