перезалил видос на рутуб, чтобы посмотрели, прежде чем рассказывать, что ничего хитрого тут нет. КРАМ - тебе намек: "чтобы судить о вкусе устриц..."
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
собственно, об этом и речь в теме о хитрых алгоритмах и решениях, не так ли?maxlab писал(а):Так что, не все так однозначно
я, конечно, в те годы еще в школе учился, но сдаётся мне, что не сигнал раньше выдавать надо было, а программно номер знакоместа на 3 уменьшать... хотя, конечно, это моя фантазияzAries писал(а):Нужно было выдавать
сигнал раньше, чем он пришёл на самом деле.
ты б определился уже, реальный пацан ты или нет? а то в теме на форуме любителей (сиречь, те же блондинки) ты завсегдатай, но монокль из глаза не вынимаешь, будто в клубе джентльменов находишься...КРАМ писал(а):"Реальные пацаны" читают техническую литературу.
собственно, об этом и речь в теме о хитрых алгоритмах и решениях, не так ли?[/uquote]maxlab писал(а):Так что, не все так однозначно
итак, изучив матчасть атмеги64, вы наверняка ответите на вопрос, возможно ли сделать на ней:maxlab писал(а):Прежде всего изучайте матчасть
пока что в этой теме с регулярной завидностью (в среднем раз в год) возникают посты про зеркалирование битов в байте - как кто-то прочитает Кнута, так и постит откровение (кстати, и я об этом писал, в другой теме https://radiokot.ru/forum/viewtopic.php?f=20&t=6291, правда... и не читав Кнута).maxlab писал(а):то можно замутить и покруче фишки
Код: Выделить всё
data = (data & ~(1 << nbit)) | (val << nbit);Код: Выделить всё
bool isPowerOfTwo = (n > 0) && ((n & (n - 1)) == 0);Код: Выделить всё
int m = 16; // Должно быть степенью двойки
int remainder = n & (m - 1); // Эквивалент n % 16, но работает в разы быстрее
Код: Выделить всё
// Если n = 10 (1010), то вернет 2 (0010)
int lowest_bit = n & -n;
Код: Выделить всё
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)
}Код: Выделить всё
a ^= b;
b ^= a;
a ^= b;
Код: Выделить всё
int mul_by_8 = n << 3; // Эквивалент n * 8
int div_by_4 = n >> 2; // Эквивалент n / 4
Код: Выделить всё
a -= a;
a ^= a;
Код: Выделить всё
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;
}
Код: Выделить всё
int fast_abs(int n) {
int mask = n >> 31;
return (n + mask) ^ mask;
}Во-первых - не факт. Зависит от системы команд CPU. Например ARM имеет команды условного выполнения. И ваше выражение скомпилится в код из 3-х или даже 2-х команд и без всяких ветвлений.alexander.k писал(а): Ср авг 12, 2026 21:33:06Классическое if (x < 0) x = -x; использует ветвление. Если данные случайны, процессор будет часто ошибаться в предсказании, теряя десятки тактов.
Код: Выделить всё
#define ABS32(x) (((s32)(x) ^ (s32)(x) >> 31) - ((s32)(x) >> 31)) //модуль xТак себе оптимизация.
Код: Выделить всё
n = ABS32(iu);
0xEA83 0x77E3 EOR R7,R3,R3, ASR #+31
0xEBA7 0x77E3 SUB R7,R7,R3, ASR #+31