Selamlar,
Ayrı ayrı gelen 8 bit datayı 32bit değişkende yanyana getirmek istiyorum.Aşağıdaki şekilde yapıyorum sonuç yanlış çıkıyor.
unsigned long sonuc;
sonuc= (binler<<8);
sonuc= (yuzler<<8);
sonuc= (onlar<<8);
sonuc= (birler<<8);
lsb ile msb sırası nedir ? ona göre kaydırma işlemi yap
unsigned long sonuc;
sonuc=binler
sonuc=sonuc<<8
sonuc|=yuzler
sonuc=sonuc<<8
sonuc|=onlar
sonuc=sonuc<<8
sonuc|=birler
sanki böyle olur. aşağıdakini tek satırda da yazabilirsin.
sonuc=sonuc<<8
sonuc|=birler
sonuc =((unsigned long int) binler << 24) | ((unsigned long int) yüzler << 16) | ((unsigned long int) onlar << 8 ) | ((unsigned long int) birler)
NOT:
Eğer amaç 8 bitlik 4 tane veriyi 32 bitte birleştirmek ise bu şekilde yapabilirsin. Ama 1 , 5 , 6 , 9 gibi 4 sayıyı 9651 yapmaksa o şekilde olmaz.
-------
Alıntı yapılan: Klein - 11 Mart 2012, 20:20:14
Ama 1 , 5 , 6 , 9 gibi 4 sayıyı 9651 yapmaksa o şekilde olmaz.
Amacım bu şekilde 4 sayıyı 32 bitte yanyana getirmek.Bunu nasıl yapabiliriz.
yazdığım kodları okudunuz mu?
Alıntı yapılan: AST - 11 Mart 2012, 21:55:32
Amacım bu şekilde 4 sayıyı 32 bitte yanyana getirmek.Bunu nasıl yapabiliriz.
sayılar decimal mi ?
Alıntı yapılan: omereliusuk - 11 Mart 2012, 21:59:35
yazdığım kodları okudunuz mu?
math.h kütüphaneli olanı denedim ama çalıştıramadım.Başka bir sorun var herhalde.Yeniden gözden geçiriyorum.
Alıntı yapılan: muhittin_kaplan - 11 Mart 2012, 22:18:35
sayılar decimal mi ?
Sayılar hexadecimal.4 adet hexadecimal sayı seri porttan geliyor.Ben bunları 32 bitte birleştirip swtich case yapısı ile kontrol edip, buna göre çıkış almak istiyorum.
Alıntı yapılan: Klein - 11 Mart 2012, 20:20:14
sonuc =(binler << 24) | (yüzler << 16) | (onlar << 8 ) | birler
@klein'in yaptığı en mantıklılarından. hexadecimal ilse sayı
0x9651
olur. yalnız 9651 olmaz. decimal karşılığı 34981 olur.
case(9651)olmaz.
ama;
case(0x9651)
---------------------------
düzeltme:
case(0x09060501)yazarsanız olur.
Alıntı yapılan: omereliusuk - 11 Mart 2012, 23:01:13
@klein'in yaptığı en mantıklılarından. hexadecimal ilse sayı
0x9651
olur. yalnız 9651 olmaz. decimal karşılığı 34981 olur.
case(9651)olmaz.
ama;
case(0x9651)
yazarsanız olur.
0x9651 olmaz, 0x9060501 olur.İşlem hatası yaptınız heralde. Soran arkadaşın kafası karışmasın şimdi.
Yani (1<<0) | (5<<8 ) | (6<<16) | (9<<24)=0x09060501 olur.
eğer sayıların 0-9 aralığında ise
binler*1000+yüzler*100+onlar*10+birler
Ama bunun için sonuç sayısının long olmasına gerek yok. 4 haneli sayı olacağı için 16 bit yeter.
eğer sayılar 9'dan büyük olabiliyor ise , önceki mesajlarda olduğu gibi.
0x04 0x03 0x02 0x01
_32bitlik_sayi=0x04*(65536)+0x03*(4096)+0x02*(256)+0x01;
buda farklı bir yöntem
edit:
sen sanırsam seri porttan bir data alıyorsun bu datayı ascii karakter olarakmı alıyorsun yoksa direk sayıyımı gönderiyorsun
yani 1234 ascii karakter dizisi hexadecimal olarak 0x31 0x32 0x33 0x34 olarak gelir eğer string olarak aldığın sayıyı integeri dönüştürmek istiyorsan
data1="1234"; ///(seri porttan gelen sayı)
_16bitlik_sayi=Convert.ToInt(data1);