Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Огледално обръщане на 16 битово число
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=4957
Страница 1 от 1

Автор:  mk912 [ Нед Окт 14, 2007 12:21 am ]
Заглавие:  Огледално обръщане на 16 битово число

Въпросът ми е следния: Имам 16 битово число което трябва да завъртя огледално - 0<->15, 1<->14, 2<->13 и т.н.
Как може да стане най-бързо под С?
Поздрави

Автор:  шопов [ Нед Окт 14, 2007 12:59 am ]
Заглавие: 

edit: сложих го като функция

u16 flip(u16 t)
{

/* flip single bits */
t = ((t & 0x5555) << 1) | ((t & 0xaaaa) >> 1);
/* flip bit pairs */
t = ((t & 0x3333) << 2) | ((t & 0xcccc) >> 2);
/* flip half bytes */
t = ((t & 0x0f0f) << 4) | ((t & 0xf0f0) >> 4);
/* flip bytes */
t = ((t & 0x00ff) << 8) | ((t & 0xff00) >> 8);

return t;
}

Автор:  VSU [ Нед Окт 14, 2007 1:14 am ]
Заглавие: 

unsigned int mirror(unsigned int b)

{
char a;
unsigned int c;
c=0;
for(a=0;a<15;a++)
{
if(b & 0x0001) c += 1;
b>>=1;
c<<=1;
}
return c;
}

Автор:  TheWizard [ Нед Окт 14, 2007 1:15 am ]
Заглавие: 

Google - "Reverse bits" или "bit-reversing"
нещо като:
http://graphics.stanford.edu/~seander/b ... rseObvious

Автор:  kiiid [ Нед Окт 14, 2007 2:06 am ]
Заглавие: 

for (unsigned char t=0; t<16; t++) y|=((((unsigned int)x>>t)&1)<<(15-t));

x ти е входното число, y изходното

Автор:  mk912 [ Нед Окт 14, 2007 10:49 am ]
Заглавие: 

Мислех си че има мат. ф-я която го описва но в крайна сметка няма значение просто ще губя малко проц.време. Благодаря много на всички за предложенията :prayer: .

Автор:  bobyk [ Нед Окт 14, 2007 7:05 pm ]
Заглавие: 

Може би избора ти ще зависи и от хардуера ти. Ще гониш ли оптимизации - размер или скорост. Например може да е глупаво ама един AVR може да го обърне за 32 цикъла, като директно копирам бит по бит, това за неговата архитектура би било по бързо и ефективно май от всички предложени решения до тук, С е красив и език с мощни изразни средства ама това на асм ще дойде по добре.
П.П. по принцип все ме гонят оптимизации (съзнателно или не) като пиша нещо и всяка излишна инструкция ми е като трън в очите.

Автор:  mk912 [ Нед Окт 14, 2007 8:18 pm ]
Заглавие: 

Може би аз някъде бъркам но на VSU и kiiid функциите не работят коректно. В крайна сметка товасвърши работа
unsigned int reverse (unsigned int n)
{
return ((n & 0x01) << 15)
| ((n & 0x02) << 13)
| ((n & 0x04) << 11)
| ((n & 0x08) << 9)
| ((n & 0x10) << 7)
| ((n & 0x20) << 5)
| ((n & 0x40) << 3)
| ((n & 0x80) << 1)
| ((n & 0x100) >> 1)
| ((n & 0x200) >> 3)
| ((n & 0x400) >> 5)
| ((n & 0x800) >> 7)
| ((n & 0x1000) >> 9)
| ((n & 0x2000) >> 11)
| ((n & 0x4000) >> 13)
| ((n & 0x8000) >> 15);
}
Отнема горе-долу 20микро сек. на 8 МХц та е поносимо. Поздрави

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/