|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 5:11 pm
| Автор |
Съобщение |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 размяна на битове
Нещо съм блокирал май... Има ли елегантен начин за размяна само на битове 7<->8, 6<->9, 5<->11, 4<->12, без да се закачат останалите, в един unsigned int? Сигурен съм че има, ама в момента ми убягва.
_________________ 'просто' е технически синоним на 'красиво'
|
| Нед Ное 22, 2015 2:14 pm |
|
 |
|
DanielDimov
Ранг: Почетен член
Регистриран на: Нед Фев 16, 2014 3:36 pm Мнения: 953
|
 Re: размяна на битове
с таблица ще стане най-лесно и най-бързо
|
| Нед Ное 22, 2015 2:43 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: размяна на битове
За много платформи има инструкции за byte order (REV) и bit order (RBIT), доколкото схващам ти трябват и двете, т.е.
unsigned int foo(unsigned int x) { return __RBIT(__REV16(x))>>16; }
евентуално foo може да е inline и ако компилираш с Ц++ може да е constexpr.
|
| Нед Ное 22, 2015 3:31 pm |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: размяна на битове
Те всъщност са 8 бита - просто трябва първо да >>4 после обръщаш битовете в целия байт и накрая <<4. Обръщането според архитектурата - ако има CPU инструкция добре, ако не с таблица.
_________________ Мразя да мразя ...
|
| Нед Ное 22, 2015 5:23 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: размяна на битове
Верно ли само изброените битове? Че и с дупка  Значи нещо от сорта:
|
| Нед Ное 22, 2015 7:17 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: размяна на битове
Всъщност размяната даже е малко по сложна отколкото я описах  В едната посока е 4->7, 5->8, 6->9, 7->10 В другата е 7->11, 6->10, 5->9, 4->8 След приличен обяд успях да вържа някакъв код, ама тепърва ще го пробвам... (k[r] ми е 16-битовото число) като xb[] табличката е  |  |  |  | Код: const unsigned char xb[16] = {0b0000, 0b1000, 0b0100, 0b1100, 0b0010, 0b1010, 0b0110, 0b1110, 0b0001, 0b1001, 0b0101, 0b1101, 0b0011, 0b1011, 0b0111, 0b1111};
|  |  |  |  |
_________________ 'просто' е технически синоним на 'красиво'
|
| Нед Ное 22, 2015 8:46 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: размяна на битове
Е не е по-сложно... това за каква платформа е? Питам щото ако е arm както си го написал е супер неефективно 
|
| Нед Ное 22, 2015 9:12 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: размяна на битове
Arm?? Тва пък какво е? (подразбира се че не е...) Виж сега, аз не се смятам за велик програматор. Моята философия е по-обща. Ако си в настроение да ми подобриш кода, ще ти благодаря (между псувните че не съм се сетил сам  )
_________________ 'просто' е технически синоним на 'красиво'
|
| Нед Ное 22, 2015 9:24 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: размяна на битове
За съжаление кристалното ми кълбо се повреди и няма как да разбера какъв тип архитектура и какъв компилатор ползваш.
|
| Нед Ное 22, 2015 10:04 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: размяна на битове
Ми да беше споменал. Аз съм зарит от кристални кълба дето не ги ползвам. Пик16 ми е архитектурата за това и ХС8 компилатор
_________________ 'просто' е технически синоним на 'красиво'
|
| Нед Ное 22, 2015 10:14 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: размяна на битове
Ти направо ме закопа... не съм ги чувал тия  Единственото дето знам е че май са 8-бит... Компилаторът пък хептен нищо не ми говори, все пак ако е добър в оптимизациите може би не трябва да му се пречкаш с междинни променливи. Пробвай с един голям израз директно да му дадеш резултата пък той да си преценява т.е. нещо от сорта: k[r]=(k[r] & 0xf00f) | ((k[r] & 0xf0) << 4 ) | ((unsigned int)xb[(k[r]>>8) & 0xf] << 4); Просто виж какъв асемблер генерира и прецени. Ак о с общия израз e добре, може да го подобриш още като преместиш последния шифт от кода в таблицата. Тя нали е 8 битова, т.е. да шифтнеш стойностите й.
|
| Нед Ное 22, 2015 11:51 pm |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
 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 8:08 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: размяна на битове
Последния ред, а и предните 4, са за пик18. Човека търси решение за пик16. @Н'бабане, ако те устройва на асемблер мога да бутна едно рамо
|
| Пон Ное 23, 2015 9:59 am |
|
 |
|
bobihot
Ранг: Форумен бог
Регистриран на: Сря Фев 13, 2013 3:35 pm Мнения: 1803
|
 Re: размяна на битове
Повечето МП архитектури имат инструкция за размени тетрадите в байта. Та май такава ти трябва. SWAP в x51. При пиковете-ненам.
|
| Пон Ное 23, 2015 12:27 pm |
|
 |
|
Н'бабане Гт'муан'га
Ранг: Форумен бог
Регистриран на: Сря Яну 25, 2012 9:14 am Мнения: 5298
|
 Re: размяна на битове
@CarBeta, мерси настина, но няма да ми трябва асемблер. Всъщност аз съм го загърбил от години вече и винаги гледам да мина по най-правата крива  В общи линии това което съм сътворил ми върши работа, оттук нататък всички оптимизации ще са единствено за спорта.
_________________ 'просто' е технически синоним на 'красиво'
|
| Пон Ное 23, 2015 12:53 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|