| Микроконтролери и електроника 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 ] |
| Заглавие: | |
Мислех си че има мат. ф-я която го описва но в крайна сметка няма значение просто ще губя малко проц.време. Благодаря много на всички за предложенията |
|
| Автор: | 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/ |
|