Byte birleştirme algoritması?

Başlatan Nedenler, 25 Kasım 2014, 13:28:39

Nedenler

Elimde 5 byte veri var. a,b,c,d,e olsun. Sıralı bir şekilde 40 bit yapar. Ben bu byteları 32 bitlik bir değişkende toplamak istiyorum. make32 fonksiyonunu düşünün. Fakat en büyük değerlikli bitten başlayarak;
a'nın son 6 bitini,
b'nin 8 bitini,
c'nin 8 bitini,
d'nin son 3 bitini,
e'nin son 7 bitini sıralı bir şekilde birleştirip 32 bitlik bir değişkende toplamak istiyorum.

Bunu iki for döngüsü ile bitleri teker teker kontrol ederek ve 32 bitlik değişkene teker teker yazarak yapabiliyorum.
Fakat elimde 16 adet abcde değişkenleri ve 16 adet birleştirilecek 32 bitlik değişkenim olduğu için for döngüleriyle bu işlem çok zaman alıyor.
En hızlı şekilde bu işlemi nasıl yapabilirim?

Kabil ATICI

VE ve VEYA ile. Bu hemen hemen her dilde var.
Kullanmak istemediğin bölümleri VE ile maskele, sonucu istediğin gibi sağa veya sola kaydır ve birleştirmek istediğin bayt üzerine VEYA uygula.
Olmaz dersen bu işlemi ASM üzerinde uyguladım.
ambar7

ercan_t

merhaba,


c de union var  onla yapabilirsin :)

AsHeS

Alıntı yapılan: Nedenler - 25 Kasım 2014, 13:28:39
Elimde 5 byte veri var. a,b,c,d,e olsun. Sıralı bir şekilde 40 bit yapar. Ben bu byteları 32 bitlik bir değişkende toplamak istiyorum. make32 fonksiyonunu düşünün. Fakat en büyük değerlikli bitten başlayarak;
a'nın son 6 bitini,
b'nin 8 bitini,
c'nin 8 bitini,
d'nin son 3 bitini,
e'nin son 7 bitini sıralı bir şekilde birleştirip 32 bitlik bir değişkende toplamak istiyorum.

Bunu iki for döngüsü ile bitleri teker teker kontrol ederek ve 32 bitlik değişkene teker teker yazarak yapabiliyorum.
Fakat elimde 16 adet abcde değişkenleri ve 16 adet birleştirilecek 32 bitlik değişkenim olduğu için for döngüleriyle bu işlem çok zaman alıyor.
En hızlı şekilde bu işlemi nasıl yapabilirim?

struct byte_merge_s/*Packed derlenmeli. GCC için __attribute__((packed))*/
{
	uint32_t bm_part1 	:6;
	uint32_t bm_part2		:8;
	uint32_t bm_part3		:8;
	uint32_t bm_part4		:3;
	uint32_t bm_part5		:7;
};

uint32_t byte_merger(unsigned char number_array[])
{
	uint32_t merged_number;
	struct byte_merge_s *byte_merge_ptr;
	
	byte_merge_ptr = (struct byte_merge_s*)&merged_number;
	
	byte_merge_ptr -> bm_part1 = number_array[0] & 0x3F;
	byte_merge_ptr -> bm_part2 = number_array[1];
	byte_merge_ptr -> bm_part3 = number_array[2];
	byte_merge_ptr -> bm_part4 = number_array[3] & 0x07;
	byte_merge_ptr -> bm_part5 = number_array[4] & 0x7F;
	
	return merged_number;
}
[\code]

XX_CİHAN_XX

union
{
	uint32_t val;
	struct
	{
		uint8_t	a	:6;
		uint8_t	b	:8;	
		uint8_t	c	:8;	
		uint8_t	d	:3;	
		uint8_t	e	:7;				
	}temp;
}data;
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Nedenler

CCS C'de kullanacağım bunları. Struct ve union konularına da çok hakim değilim. Zahmet olmazsa.. :)

XX_CİHAN_XX

Peki buyrun o zaman anlayacağınız şekilde ve ccs e uygun bir çözüm. (a registerinin en yüksek değerlikli kısmı oluşturduğunu kabul ettim)
e >>= 1;
if(d&0x20) e|=0x80;
d >>= 6;
d |= (c<<2);
c >>= 6;
c |= (b<<2);
b >>= 6;
b |= (a&0xFC);
x = make32(b,c,d,e);

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

mir_as82

#7
typedef struct {
   unsigned int part1 : 7; //e LSB side
   unsigned int part2 : 3; //d
   unsigned int part3 : 8; //c
   unsigned int part4 : 8; //b
   unsigned int part5 : 6; //MSB side a
}MyParts;

typedef union {
   unsigned int Myint;
   MyParts part;
}MyVariable;

int main()
{
   unsigned char a = 0xe0, b = 0xff, c = 0xff, d = 0xff, e = 0x80;
   MyVariable degiskenim;
   degiskenim.part.part1 = e >> 1;
   degiskenim.part.part2 = d >> 5;
   degiskenim.part.part3 = c;
   degiskenim.part.part4 = b;
   degiskenim.part.part5 = a >> 2;
   printf("benim degiskenim %x\n", degiskenim.Myint);
   return 0;
}

Hocam burada şunu gözlemledim. Sistem "little endian" olunca lsb ye gelen bit önce tanımlanmalı.

Nedenler

Sağolun arkadaşlar kullandım bunlardan birini çok işime yaradı.

mir_as82

Hocam bu tarz kodlarda genelde sadece birleştirmeye yönelik kod yazma. Bunları tek bir değişkenmiş gibi kullanabilecek yapıda kod yazarsan ileriki aşamada işine yarayabilir.