| Автор |
Съобщение |
|
mk912
Ранг: Новодошъл
Регистриран на: Съб Сеп 15, 2007 11:24 pm Мнения: 109
|
 Огледално обръщане на 16 битово число
Въпросът ми е следния: Имам 16 битово число което трябва да завъртя огледално - 0<->15, 1<->14, 2<->13 и т.н.
Как може да стане най-бързо под С?
Поздрави
|
| Нед Окт 14, 2007 12:21 am |
|
 |
|
шопов
Ранг: Минаващ
Регистриран на: Сря Май 17, 2006 4:22 pm Мнения: 34 Местоположение: софия
|
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;
}
Последна промяна шопов на Нед Окт 14, 2007 2:22 am, променена общо 1 път
|
| Нед Окт 14, 2007 12:59 am |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
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;
}
|
| Нед Окт 14, 2007 1:14 am |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
Google - "Reverse bits" или "bit-reversing"
нещо като:
http://graphics.stanford.edu/~seander/b ... rseObvious
|
| Нед Окт 14, 2007 1:15 am |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
for (unsigned char t=0; t<16; t++) y|=((((unsigned int)x>>t)&1)<<(15-t));
x ти е входното число, y изходното
|
| Нед Окт 14, 2007 2:06 am |
|
 |
|
mk912
Ранг: Новодошъл
Регистриран на: Съб Сеп 15, 2007 11:24 pm Мнения: 109
|
Мислех си че има мат. ф-я която го описва но в крайна сметка няма значение просто ще губя малко проц.време. Благодаря много на всички за предложенията  .
|
| Нед Окт 14, 2007 10:49 am |
|
 |
|
bobyk
Ранг: Ориентиран
Регистриран на: Пон Яну 09, 2006 11:32 am Мнения: 276 Местоположение: Kozloduy
|
Може би избора ти ще зависи и от хардуера ти. Ще гониш ли оптимизации - размер или скорост. Например може да е глупаво ама един AVR може да го обърне за 32 цикъла, като директно копирам бит по бит, това за неговата архитектура би било по бързо и ефективно май от всички предложени решения до тук, С е красив и език с мощни изразни средства ама това на асм ще дойде по добре.
П.П. по принцип все ме гонят оптимизации (съзнателно или не) като пиша нещо и всяка излишна инструкция ми е като трън в очите.
|
| Нед Окт 14, 2007 7:05 pm |
|
 |
|
mk912
Ранг: Новодошъл
Регистриран на: Съб Сеп 15, 2007 11:24 pm Мнения: 109
|
Може би аз някъде бъркам но на 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 МХц та е поносимо. Поздрави
|
| Нед Окт 14, 2007 8:18 pm |
|
|