Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Visual C# => Konuyu başlatan: AST - 11 Mart 2012, 19:43:58

Başlık: 8bit verileri 32bit yapmak
Gönderen: AST - 11 Mart 2012, 19:43:58
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);


       
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: muhittin_kaplan - 11 Mart 2012, 19:45:51
lsb ile msb sırası nedir ? ona göre kaydırma işlemi yap
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: muhittin_kaplan - 11 Mart 2012, 19:48:58
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
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: Klein - 11 Mart 2012, 20:20:14
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: omereliusuk - 11 Mart 2012, 21:45:10
-------
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: AST - 11 Mart 2012, 21:55:32
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: omereliusuk - 11 Mart 2012, 21:59:35
yazdığım kodları okudunuz mu?
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: muhittin_kaplan - 11 Mart 2012, 22:18:35
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 ?
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: AST - 11 Mart 2012, 22:19:48
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: AST - 11 Mart 2012, 22:23:37
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: omereliusuk - 11 Mart 2012, 23:01:13
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: yamak - 12 Mart 2012, 01:12:03
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: Klein - 12 Mart 2012, 10:57:48
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.
Başlık: Ynt: 8bit verileri 32bit yapmak
Gönderen: cemilkendir - 12 Mart 2012, 11:04:49
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);