8bit verileri 32bit yapmak

Başlatan AST, 11 Mart 2012, 19:43:58

AST

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);

       

muhittin_kaplan

lsb ile msb sırası nedir ? ona göre kaydırma işlemi yap

muhittin_kaplan

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

Klein

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.

omereliusuk

#4
-------

AST

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.

omereliusuk

#6
yazdığım kodları okudunuz mu?

muhittin_kaplan

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 ?

AST

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.

AST

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.

omereliusuk

#10
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.

yamak

#11
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.

Klein

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.

cemilkendir

#13
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);