Отговори на тема  [ 8 мнения ] 
Огледално обръщане на 16 битово число 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 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
Профил
Ранг: Напреднал
Ранг: Напреднал

Регистриран на: Нед Авг 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
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
Google - "Reverse bits" или "bit-reversing"
нещо като:
http://graphics.stanford.edu/~seander/b ... rseObvious


Нед Окт 14, 2007 1:15 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 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
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 15, 2007 11:24 pm
Мнения: 109
Мнение 
Мислех си че има мат. ф-я която го описва но в крайна сметка няма значение просто ще губя малко проц.време. Благодаря много на всички за предложенията :prayer: .


Нед Окт 14, 2007 10:49 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

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


Нед Окт 14, 2007 7:05 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Сеп 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
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни