Отговори на тема  [ 16 мнения ]  Отиди на страница 1, 2  Следваща
размяна на битове 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение размяна на битове
Нещо съм блокирал май... :-x
Има ли елегантен начин за размяна само на битове 7<->8, 6<->9, 5<->11, 4<->12, без да се закачат останалите, в един unsigned int?
Сигурен съм че има, ама в момента ми убягва.

_________________
'просто' е технически синоним на 'красиво'


Нед Ное 22, 2015 1:14 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Фев 16, 2014 2:36 pm
Мнения: 953
Мнение Re: размяна на битове
с таблица ще стане най-лесно и най-бързо


Нед Ное 22, 2015 1:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: размяна на битове
За много платформи има инструкции за byte order (REV) и bit order (RBIT), доколкото схващам ти трябват и двете, т.е.

unsigned int foo(unsigned int x)
{
return __RBIT(__REV16(x))>>16;
}

евентуално foo може да е inline и ако компилираш с Ц++ може да е constexpr.


Нед Ное 22, 2015 2:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 10:53 pm
Мнения: 4174
Местоположение: Brussels / Пловдив
Мнение Re: размяна на битове
Те всъщност са 8 бита - просто трябва първо да >>4 после обръщаш битовете в целия байт и накрая <<4. Обръщането според архитектурата - ако има CPU инструкция добре, ако не с таблица.

_________________
Мразя да мразя ...


Нед Ное 22, 2015 4:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: размяна на битове
Верно ли само изброените битове? Че и с дупка ;-)

Значи нещо от сорта:

Код:
uint32_t foo(uint32_t x)
{
   uint32_t a, b, mask;
   
   mask = 0x950;
   a = x & mask;      // bits 11 8 6 4
   x ^= a;
   mask += mask << 1;
   b = x & mask;      // bits 12 9 7 5
   x ^= b;
   
   a += a + (b>>1);   // bits 11 12 _ 8 9 6 7 4 5

   b = a >> 7;
   b += a << 7;
   x += b & mask;      // bits 4 5 _ _ _ _ _ 11 12
   
   x += (a & 0xC) << 2; // bits 4 5 _ 6 7 _ _ 11 12
   
   x += (a >> 2) & 0xC; // bits 4 5 _ 6 7 8 9 11 12
   
   return x;
}


Нед Ное 22, 2015 6:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: размяна на битове
Всъщност размяната даже е малко по сложна отколкото я описах :)
В едната посока е 4->7, 5->8, 6->9, 7->10
В другата е 7->11, 6->10, 5->9, 4->8

След приличен обяд успях да вържа някакъв код, ама тепърва ще го пробвам... (k[r] ми е 16-битовото число)

Код:
unsigned char c=(k[r] & 0x0ff0)>>4;
    c=(c>>4) | (c<<4);
    c=(c & 0xf0) | xb[c & 0x0f];
    k[r]=(k[r] & 0xf00f) | ((unsigned int)c<<4);


като xb[] табличката е

Код:
const unsigned char xb[16] = {0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111};

_________________
'просто' е технически синоним на 'красиво'


Нед Ное 22, 2015 7:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: размяна на битове
Е не е по-сложно... това за каква платформа е? Питам щото ако е arm както си го написал е супер неефективно :wink:


Нед Ное 22, 2015 8:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: размяна на битове
Arm?? Тва пък какво е? (подразбира се че не е...)
Виж сега, аз не се смятам за велик програматор. Моята философия е по-обща.
Ако си в настроение да ми подобриш кода, ще ти благодаря (между псувните че не съм се сетил сам ;))

_________________
'просто' е технически синоним на 'красиво'


Нед Ное 22, 2015 8:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: размяна на битове
За съжаление кристалното ми кълбо се повреди и няма как да разбера какъв тип архитектура и какъв компилатор ползваш.


Нед Ное 22, 2015 9:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: размяна на битове
Ми да беше споменал. Аз съм зарит от кристални кълба дето не ги ползвам. Пик16 ми е архитектурата за това и ХС8 компилатор

_________________
'просто' е технически синоним на 'красиво'


Нед Ное 22, 2015 9:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: размяна на битове
Ти направо ме закопа... не съм ги чувал тия ;-)

Единственото дето знам е че май са 8-бит... Компилаторът пък хептен нищо не ми говори, все пак ако е добър в оптимизациите може би не трябва да му се пречкаш с междинни променливи. Пробвай с един голям израз директно да му дадеш резултата пък той да си преценява

т.е. нещо от сорта:

k[r]=(k[r] & 0xf00f) | ((k[r] & 0xf0) << 4 ) | ((unsigned int)xb[(k[r]>>8) & 0xf] << 4);

Просто виж какъв асемблер генерира и прецени. Ак о с общия израз e добре, може да го подобриш още като преместиш последния шифт от кода в таблицата. Тя нали е 8 битова, т.е. да шифтнеш стойностите й.


Нед Ное 22, 2015 10:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 11:48 am
Мнения: 4671
Мнение Re: размяна на битове
/*-------------------------------------------------------------------------
* Some useful macros for inline assembly stuff
*-------------------------------------------------------------------------*/
#define Nop() {_asm nop _endasm}
#define ClrWdt() {_asm clrwdt _endasm}
#define Sleep() {_asm sleep _endasm}
#define Reset() {_asm reset _endasm}

#define Rlcf(f,dest,access) {_asm movlb f rlcf f,dest,access _endasm}
#define Rlncf(f,dest,access) {_asm movlb f rlncf f,dest,access _endasm}
#define Rrcf(f,dest,access) {_asm movlb f rrcf f,dest,access _endasm}
#define Rrncf(f,dest,access) {_asm movlb f rrncf f,dest,access _endasm}
#define Swapf(f,dest,access) {_asm movlb f swapf f,dest,access _endasm }

виж какво прави последния ред

_________________
main[-1u]={1};


Пон Ное 23, 2015 7:08 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 3:01 pm
Мнения: 1438
Мнение Re: размяна на битове
Последния ред, а и предните 4, са за пик18. Човека търси решение за пик16.
@Н'бабане, ако те устройва на асемблер мога да бутна едно рамо


Пон Ное 23, 2015 8:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Фев 13, 2013 2:35 pm
Мнения: 1748
Мнение Re: размяна на битове
Повечето МП архитектури имат инструкция за размени тетрадите в байта. Та май такава ти трябва.
SWAP в x51. При пиковете-ненам.


Пон Ное 23, 2015 11:27 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 25, 2012 8:14 am
Мнения: 4577
Местоположение: Новата земя на племето Мутум'ба
Мнение Re: размяна на битове
@CarBeta, мерси настина, но няма да ми трябва асемблер. Всъщност аз съм го загърбил от години вече и винаги гледам да мина по най-правата крива :)
В общи линии това което съм сътворил ми върши работа, оттук нататък всички оптимизации ще са единствено за спорта.

_________________
'просто' е технически синоним на 'красиво'


Пон Ное 23, 2015 11:53 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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