- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
//сравниваем два числа, функция не использует операторы < и > в целях переносимости на платформы, где они не поддерживаются
auto intcmp( int a, int b ) -> int {
while( a && b ) {
a--;
b--;
}
if ( a == 0 && b == 0 ) // числа равны
return 0;
if ( a == 0 ) // a - меньше
return -1;
if ( b == 0 ) // a - больше
return 1;
assert( true ); // да нам подсунули какие-то неправильные числа
}
if ( a == b ) return 0;
while ...
if ( a == 0 ) return -1;
return 1;
Но такая версия не перехватит "неправильные" числа.
На машины тьюринга что-ли? Не могу представить себе контроллер на котором нет даже вычитания выставляющего флаги переполнения и нуля.
Ишь чего захотели!
Арифмометра Феликс Эдмундыч с вас хватит! Со встроенным C++ компилятором ;)
Почувствуй себя древним греком!
РНР таки съедает мозги...
А вычитание декрементом.
А декремент... ну если на платформе нет и декремента, C++ компилятора под такую платформу и подавно нет.
Как и под платформу где нельзя запилить операторы < и > ;)
В некотором смысле в машине Поста есть декремент всегда: из меченого в немеченый :)
(j/k)
а современные платформы?
не нужно пытаться объять необъятное (с)
Наверное.
С брейнфака на си.
А затем и на си++, путём добавления auto и стрелочки.
>>> платформы, где они не поддерживаются
>>> операторы < и > [в ЯВУ С++ );]
На фоне этого незнание логики ассерта меркнет
Видимо это причина того, что неправильные числа не палились до сих пор.
точно есть, но пишут для них, как правило, на асме.
Вот там раздолье для битоманипуляций.
Теплопроводность сковородки для жарки кофейных зерен по умолчанию установлена в ноль для совместимости с другими вселенными, в которых законы физики могут оказаться иными...
< - перейти к предыдущей ячейке
> - перейти к следующей ячейке
if ((a ^ b) & 0x4000){
if (a & 0x4000) return 1; else return -1;
}
if ((a ^ b) & 0x2000){
if (a & 0x2000) return 1; else return -1;
}
if ((a ^ b) & 0x1000){
if (a & 0x1000) return 1; else return -1;
}
....
if ((a ^ b) & 0x1){
if (a & 0x1) return 1; else return -1;
}
return 0;
// если сдвиг есть, то мона в цикле
А для правильной работы с отрицательными вроде бы достаточно прибавить к a и b 0x8000, тем самым сместив диапазон с -32768..32767 в 0..65535?
Для unsigned:
Для signed:
Для сравнения 1 и 0 например 0х8000 операций надо.
O(f(x) + const) = O(f(x)).
А с практической точки зрения эта const может вылиться в смертельные тормоза.
Окай. a ^= 0x8000, b ^= 0x8000. Результат такой же. Надеюсь, что хотя бы xor там есть...
Так что многие простые сравнения будут очень и очень долго производиться.
Например сравнение 1 и 0 раньше требовало 0 декрементов, а теперь это будет сравнение 0x8001 и 0x8000, так что декрементов будет намного больше.
Больше хотелось показать что без прибавления числа в начале алгоритм эффективнее для чисел близких к 0.
Тут выбор того сколько прибавлять будет зависеть от того, какие числа чаще должны сравниваться.
Зато не эффективнее для отрицательных...
> будет зависеть от того, какие числа чаще должны сравниваться.
Ну да, тут согласен.
Сложение инкрементом.
Умножение таким сложением.
Возведение в степень таким умножением.
Ну и посчитать 5^3
мне институтский ассемблер запомнился реализацией некоторых криптоалгоритмов, защищенных от атаки по времени и с обфускацией (любая ветка if обязана иметь примерно одинаковое количество тактов - независимость времени алгоритма от входных данных, при этом делать что то более осознанное и правдоподобное, чем nop) - было интересно, и как то надо было на асме читать конфигурационный файл, я запилил парсинг ini-подобного формата
после института ассемблер все равно не пригодился, но уж лучше его, чем ненужную машину тьюринга
У нас и на лабах по прологу были тупые базы данных, и, внимание, вычисление функции через ряд(!), вместо того, чтобы попробовать порешать на нем какие-нибудь логические задачки... Что поделать, сибирская глубинка.
> реализацией некоторых криптоалгоритмов
Вот. Вот это действительно интересная лаба.
> более осознанное и правдоподобное, чем nop
А вот это, походу, уже не от атаки по времени, а от атаки замером потребляемого тока ;) К PC она, конечно, не применима, но вот к чипу с внешним питанием, типа той же симки - вполне реальна.
> после института ассемблер все равно не пригодился
Ну да, сам по себе он сейчас не особо нужен. Разве что для чтения дизасма... Но зато его изучение помогает разобраться в принципах работы компа.
> сибирская глубинка
У нас пролога вообще не было. :( Город большой, но в плане образования не очень. Я, конечно, очень благодарен родному универу за бесплатное (в целом вполне неплохое) образование, которое получил, но минусов довольно много. ASM был, ковыряли всякие несложные задачки типа "распарсить и сложить числа, прочитанные с консоли". Хорошо хоть, что препод заставлял объяснять содержимое каждого регистра и кадра стека после каждой инструкции. С тех пор ассемблера особо не видел.