Хитрые, необычные алгоритмы и код

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »



перезалил видос на рутуб, чтобы посмотрели, прежде чем рассказывать, что ничего хитрого тут нет. КРАМ - тебе намек: "чтобы судить о вкусе устриц..."
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25583
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ARV",url="/forum/viewtopic.php?p=4771400#p4771400"]"чтобы судить о вкусе устриц..."[/uquote]
Очень в тему. В смысле поговорка.
Я как раз эти "устрицы" регулярно ем. В отличии от Вас. :tea:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

устриц-то я не ел, но про них и не говорю. а видосик видел, и говорю о нём. ты видел видосик? или ты как тот академик, который на вопрос "при какой температуре кипит вода" рисует трехмерную диаграмму зависимости точки кипения от высоты над уровнем моря, количества и состава примесей и вместо ответа "100 градусов" заряжает лекцию на 4 часа?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25583
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="ARV",url="/forum/viewtopic.php?p=4771402#p4771402"]устриц-то я не ел, но про них и не говорю. а видосик видел...[/uquote]
Роман Викторович, "видосики" на технические темы смотрят только блондинки.
"Реальные пацаны" читают техническую литературу.
:music:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 315
Зарегистрирован: Ср сен 11, 2024 10:18:53

Сообщение zAries »

[uquote="ARV",url="/forum/viewtopic.php?p=4771393#p4771393"]...Кстати, световое перо на Радио-86 делалось аппаратными средствами микросхемы контроллера дисплея, знатоки хреновы...[/uquote]
Ну да, хреновы, а вы, видимо - шевалье д`Артаньян и убьёте каждого, кто дурно отзовётся о вашей лошади.
Конечно делалось на "железной" ВГ75 ибо за вывод на дисплей отвечала она, был у неё и вход для пера.
Но дело вот в чём, ВГ75/8275 имела такой себе косяк - задержку на 3 знакоместа. Нужно было выдавать
сигнал раньше, чем он пришёл на самом деле. Вот вам и поле для деятельности.
Нет, можно конечно было налепить железных костылей, но кто ищет лёгкие пути, верно ?
Audiatur et altera pars !
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 490
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

[uquote="ARV",url="/forum/viewtopic.php?p=4771393#p4771393"]Просто напомню, что по учебникам аэродинамики майский жук летать не должен.[/uquote]

По мнению инженера авиаконструктора в небо можно запустить и кирпич. Вопрос соотношения взлетной массы и приложенной энергии. Квадрокоптеры тоже не имеют аэродинамических обводов.
А про полеты насекомых неплохо написано в книге "Мой мир" у В. Гребенникова. Там не только аэродинамика, но и электростатика как подъемная сила, по мнению самого В. Гребенникова.
Так что, не все так однозначно :)
Девице - Device
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

maxlab писал(а):Так что, не все так однозначно
собственно, об этом и речь в теме о хитрых алгоритмах и решениях, не так ли?
zAries писал(а):Нужно было выдавать
сигнал раньше, чем он пришёл на самом деле.
я, конечно, в те годы еще в школе учился, но сдаётся мне, что не сигнал раньше выдавать надо было, а программно номер знакоместа на 3 уменьшать... хотя, конечно, это моя фантазия
КРАМ писал(а):"Реальные пацаны" читают техническую литературу.
ты б определился уже, реальный пацан ты или нет? а то в теме на форуме любителей (сиречь, те же блондинки) ты завсегдатай, но монокль из глаза не вынимаешь, будто в клубе джентльменов находишься...

Добавлено after 9 minutes 4 seconds:
небольшой оффтоп.

вот реальные пацаны разложили по полочкам, что аппарат тяжелее воздуха взлететь не может. а блондины Райт взяли, и взлетели. и реальные пацаны тут же разработали научное обоснование, почему это возможно, взамен научного объяснения, почему это невозможно.

другой реальный пацан утверждал, что конница - это лучшее средство наступления в войне, а какие-то блондины с голубыми глазами посадили других блондинов в железные коробки и конницу половины планеты размазали в кашу...

один известный троечник взял, и ляпнул, что время - величина относительная...

это я всё к чему? к тому, что есть пределы теоретически возможного, а есть пределы технически достижимого, и это не одно и то же. когда я запостил видео, я хотел показать, как можно обойти пределы технически возможного (т.е. того, что задекларировано в даташите). а если кого-то ранит тот факт, что на паршивой атмеге можно световым пером редактировать в реальном времени видео (не поймите неправильно - с известными ограничениями, конечно!), или что возможно реализовать ЧЕТЫРЁХМЕРНОЕ световое перо (координаты X, Y, Z и угол наклона вектора "луча") - это проблемы его ЧСВ, но никак не мои
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 490
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

[uquote="ARV",url="/forum/viewtopic.php?p=4771428#p4771428"]
maxlab писал(а):Так что, не все так однозначно
собственно, об этом и речь в теме о хитрых алгоритмах и решениях, не так ли?[/uquote]
Нет, не так...
Любое "хитрое решение/алгоритм/etc" базируется на фундаментальных законах физики/математики и тд. Даже если "решатель" дошел до этого эмпирическим путем. Он просто потратил драгоценное время на эксперименты, блуждая в потемках невежества. Как мне говорили мои научные руководители... Прежде всего изучайте матчасть, а потом опускайте забрало :)

PS. Использование недокументированных фичей в чипах чудом не являются
Девице - Device
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

maxlab писал(а):Прежде всего изучайте матчасть
итак, изучив матчасть атмеги64, вы наверняка ответите на вопрос, возможно ли сделать на ней:
1. многозадачную ОС с окнами, перетаскиванием их по экрану, и закрытием крестиком в углу
2. осциллограф, способный уверенно отличить прямоугольник от синуса на частоте 10 и более МГц
3. графический редактор
4. световое перо с 4 степенями свободы
5. генератор прямоугольных испульсов до 5 МГц с регулированием "пером" частоты и скважности
6. собственно, сам экран на матрице двухцветных светодиодов с 16 оттенками цвета размерностью 32х32 пиксела

причем все перечисленное должно работать ОДНРОВРЕМЕННО, а не в виде отдельных опытов.

если бы меня спросили (раньше), я бы сказал "невозможно, слабое железо". но кто-то не изучил матчасть, и сделал видео...

Добавлено after 29 minutes 38 seconds:
P.S. я даже упростил: световое перо еще и поворот вокруг собственной оси может определять, т.е. 5 степеней свободы!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 490
Зарегистрирован: Вт апр 23, 2013 22:21:18
Откуда: KUBAN, Krasnodar

Сообщение maxlab »

Атмега64 - это частный случай, не все его используют в своих поделках и даже не обязаны. Кино, которое Вы демонстрируете я видел лет 5 назад и скажу что автор этого устройства не профан и владеет темой.
От себя добавлю что если ваша атмега64 поддерживает memory expand - то можно замутить и покруче фишки.

PS. Чем хорош AVR это предсказуемое время исполнения команд в тактах . И сделать генератор частоты, даже с дробными значениями, можно используя алгоритм softDDS.
В PICах {не во всех} это реализовано на аппаратном уровне. Называется NCO (numeric controlled oscilator)
Последний раз редактировалось maxlab Чт дек 11, 2025 12:32:49, всего редактировалось 4 раза.
Девице - Device
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

maxlab писал(а):то можно замутить и покруче фишки
пока что в этой теме с регулярной завидностью (в среднем раз в год) возникают посты про зеркалирование битов в байте - как кто-то прочитает Кнута, так и постит откровение (кстати, и я об этом писал, в другой теме https://radiokot.ru/forum/viewtopic.php?f=20&t=6291, правда... и не читав Кнута).

а вот многие ли додумались, что можно угол поворота вокруг оси фототранзистора опредлелять, закрасив 50% его поверхности красным лаком и "подсвечивая" красно-зеленым двухцветным "дисплеем"? это разве не хитрость? или вот прям каждый второй эту идею на уме держит? или про стробоскопический осцилл - все о нем знают (КРАМ даже книжки читал с теорией!), но кто смог обеспечить поочередный СТАРТ АЦП со сдвигом в 1 ТАКТ?! или это вот прямо элементарная задача (даже на асме)?!

или в этой теме главное - обосрать каждого, а не заинтересоваться показанным?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 593
Зарегистрирован: Вт окт 01, 2024 15:22:33

Сообщение Adrift »

[uquote="ARV",url="/forum/viewtopic.php?p=4771445#p4771445"]но кто смог обеспечить поочередный СТАРТ АЦП со сдвигом в 1 ТАКТ?! или это вот прямо элементарная задача (даже на асме)?![/uquote]
На первой странице этой темы постили два варианта избавления от джиттера при входе в прерывание, используется при генерации видео в основном. Один и способов табличный, прыгают на массив из NOP-ов, т.е. его можно использовать и для выравнивания джиттера, если делать с прерываниями, и для задания задержки с точностью до такта.
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=4771445#p4771445"]но кто смог обеспечить поочередный СТАРТ АЦП со сдвигом в 1 ТАКТ?! или это вот прямо элементарная задача (даже на асме)?![/uquote]Элементарная даже без всяких асмов. В чём проблема-то? Или мануалы на МК не умеете читать?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18784
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Вообще проблем нет! Тему можно закрывать, т.к. в ней никто ничего нужного не напишет, ведь все всё знают и умеют.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Сообщения: 468
Зарегистрирован: Вс авг 16, 2015 13:08:53

Сообщение Бубоник »

Код: Выделить всё

data = (data & ~(1 << nbit)) | (val << nbit);
Сохраняет состояние бита в байте. Удобно использовать для передачи битовых значений через разнообразные интерфейсы. val - битовая переменная, nbit - номер бита в переменной data куда сохранять val.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 344
Зарегистрирован: Пт дек 11, 2015 12:56:49
Откуда: Ростов на Дону

Сообщение alexander.k »

Определяем, является ли число степенью двойки

Код: Выделить всё

bool isPowerOfTwo = (n > 0) && ((n & (n - 1)) == 0);
Операция n % m очень медленная. Если m является степенью двойки (например, размер хэш-таблицы или кольцевого буфера), ее можно заменить на побитовое И.

Код: Выделить всё

int m = 16; // Должно быть степенью двойки
int remainder = n & (m - 1); // Эквивалент n % 16, но работает в разы быстрее
возвращает число, в котором установлен только самый младший единичный бит исходного числа.

Код: Выделить всё

// Если n = 10 (1010), то вернет 2 (0010)
int lowest_bit = n & -n;
В кодировке ASCII разница между заглавными ('A' = 65) и строчными ('a' = 97) буквами составляет ровно 32, что соответствует одному биту (шестому справа).

Код: Выделить всё

char toLower(char c) {
    return c | 32;  // Устанавливает бит, превращая 'A' в 'a'
}

char toUpper(char c) {
    return c & ~32; // Сбрасывает бит, превращая 'a' в 'A'
}

char invertCase(char c) {
    return c ^ 32;  // Инвертирует регистр (XOR)
}
Обмен значений без временной переменной (XOR Swap)

Код: Выделить всё

a ^= b;
b ^= a;
a ^= b;
Вместо умножения или деления на 2, 4, 8, 16 и т.д.

Код: Выделить всё

int mul_by_8 = n << 3;  // Эквивалент n * 8
int div_by_4 = n >> 2;  // Эквивалент n / 4
Обнуление переменной - это ассемблерный трюк для экономии байтов. На С - это выглядит так.

Код: Выделить всё

a -= a;
a ^= a;
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 344
Зарегистрирован: Пт дек 11, 2015 12:56:49
Откуда: Ростов на Дону

Сообщение alexander.k »

Вот еще гениальный хак из прошлого на компьютерах. Если надо посчитать 1/sqrt(x), там, где нет быстрого вычисления квадратного корня:

Код: Выделить всё

float Q_rsqrt(float number) {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // Злой хак на уровне битов float
    i  = 0x5f3759df - ( i >> 1 );               // What the f***? (Комментарий Джона Кармака)
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // Одна итерация метода Ньютона

    return y;
}

Вычисление модуля числа без ветвлений. Классическое if (x < 0) x = -x; использует ветвление. Если данные случайны, процессор будет часто ошибаться в предсказании, теряя десятки тактов. Мы можем использовать математику и битовые сдвиги для 32-битного целого числа.

Код: Выделить всё

int fast_abs(int n) {
    int mask = n >> 31; 
    return (n + mask) ^ mask;
}
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 110
Зарегистрирован: Вт фев 28, 2017 08:13:31
Откуда: Свердловская обл.

Сообщение Zikon »

Сейчас компиляторы очень продвинутые
и очень много оптимизаций делают сами
причём очень и очень приличные
разбирался тут с генерацией кода
Иногда такие финты выкручивают что диву даёшься
И что удивительно - работает

а по поводу оптимизации ABS
так это уже сам компилятор умеет
abs1.png
(41.9 КБ) 19 скачиваний
abs2.png
(44.87 КБ) 12 скачиваний
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

alexander.k писал(а): Ср авг 12, 2026 21:33:06Классическое if (x < 0) x = -x; использует ветвление. Если данные случайны, процессор будет часто ошибаться в предсказании, теряя десятки тактов.
Во-первых - не факт. Зависит от системы команд CPU. Например ARM имеет команды условного выполнения. И ваше выражение скомпилится в код из 3-х или даже 2-х команд и без всяких ветвлений.
Во-вторых - имхо лучше уж так:

Код: Выделить всё

#define ABS32(x) (((s32)(x) ^ (s32)(x) >> 31) - ((s32)(x) >> 31)) //модуль x
Но такой код на ARM может потребовать даже больше тактов, чем классический "if (x < 0) x = -x;" скомпилированный с командой условного выполнения. Как повезёт, нет никаких гарантий.
Последний раз редактировалось jcxz Пн авг 17, 2026 18:46:56, всего редактировалось 1 раз.
Мудрый кот
Сообщения: 1799
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

Zikon писал(а): Чт авг 13, 2026 07:16:07так это уже сам компилятор умеет
abs1.png
Так себе оптимизация. :)
Древний IAR 7.80.4 for ARM компилит модуль в 2 команды:

Код: Выделить всё

     n = ABS32(iu);                                   
0xEA83 0x77E3      EOR      R7,R3,R3, ASR #+31        
0xEBA7 0x77E3      SUB      R7,R7,R3, ASR #+31
На входе аргумент (iu) - в R3; результат (n) - в R7.
Ответить

Вернуться в «Разные вопросы по МК»