- 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 ); // да нам подсунули какие-то неправильные числа
}
Fai 27.06.2012 20:54 # +2
if ( a == b ) return 0;
while ...
if ( a == 0 ) return -1;
return 1;
Но такая версия не перехватит "неправильные" числа.
bormand 27.06.2012 20:58 # +7
На машины тьюринга что-ли? Не могу представить себе контроллер на котором нет даже вычитания выставляющего флаги переполнения и нуля.
Fai 27.06.2012 21:01 # +5
eth0 27.06.2012 21:02 # +3
bormand 27.06.2012 21:05 # 0
Fai 27.06.2012 21:08 # +1
bormand 27.06.2012 21:16 # +2
interested 27.06.2012 23:02 # +4
Ишь чего захотели!
Арифмометра Феликс Эдмундыч с вас хватит! Со встроенным C++ компилятором ;)
Lure Of Chaos 27.06.2012 23:47 # +6
bormand 28.06.2012 06:02 # +2
Почувствуй себя древним греком!
govnomonad 28.06.2012 10:50 # +7
Lowezar 28.06.2012 01:08 # +3
Fai 28.06.2012 03:28 # 0
Lowezar 29.06.2012 01:28 # 0
РНР таки съедает мозги...
bormand 28.06.2012 06:06 # +2
Fai 28.06.2012 16:03 # +5
А вычитание декрементом.
А декремент... ну если на платформе нет и декремента, C++ компилятора под такую платформу и подавно нет.
bormand 28.06.2012 16:13 # +5
Как и под платформу где нельзя запилить операторы < и > ;)
TarasB 29.06.2012 13:02 # +2
interested 29.06.2012 13:12 # 0
В некотором смысле в машине Поста есть декремент всегда: из меченого в немеченый :)
(j/k)
guest 14.11.2015 15:46 # 0
guest 20.11.2015 07:35 # 0
guest 20.11.2015 15:09 # 0
guest 24.11.2015 09:43 # 0
rat4 27.06.2012 21:01 # +2
Fai 27.06.2012 21:02 # +1
ctm 28.06.2012 06:53 # +1
а современные платформы?
bormand 28.06.2012 07:26 # +5
ctm 28.06.2012 08:03 # +3
не нужно пытаться объять необъятное (с)
guest 30.06.2012 16:11 # +2
TarasB 27.06.2012 21:12 # +4
Наверное.
Fai 27.06.2012 21:14 # +7
С брейнфака на си.
А затем и на си++, путём добавления auto и стрелочки.
TarasB 27.06.2012 21:30 # +6
3.14159265 27.06.2012 21:38 # +5
>>> платформы, где они не поддерживаются
>>> операторы < и > [в ЯВУ С++ );]
На фоне этого незнание логики ассерта меркнет
Fai 27.06.2012 21:51 # +3
Видимо это причина того, что неправильные числа не палились до сих пор.
ctm 28.06.2012 07:02 # +2
Fai 28.06.2012 16:06 # 0
ctm 29.06.2012 06:31 # +3
sayidandrtfm 27.06.2012 22:05 # +1
точно есть, но пишут для них, как правило, на асме.
Вот там раздолье для битоманипуляций.
guest 14.11.2015 14:53 # 0
guest 20.11.2015 07:35 # 0
guest 20.11.2015 15:08 # 0
guest 24.11.2015 09:43 # 0
vistefan 27.06.2012 22:33 # +4
Теплопроводность сковородки для жарки кофейных зерен по умолчанию установлена в ноль для совместимости с другими вселенными, в которых законы физики могут оказаться иными...
carsten 28.06.2012 01:57 # 0
bormand 28.06.2012 06:05 # +7
< - перейти к предыдущей ячейке
> - перейти к следующей ячейке
carsten 28.06.2012 16:09 # 0
Lowezar 28.06.2012 16:53 # 0
Fai 28.06.2012 16:56 # 0
0rt 28.06.2012 06:34 # +2
ctm 28.06.2012 06:46 # +3
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;
// если сдвиг есть, то мона в цикле
bormand 28.06.2012 07:44 # +2
А для правильной работы с отрицательными вроде бы достаточно прибавить к a и b 0x8000, тем самым сместив диапазон с -32768..32767 в 0..65535?
ctm 28.06.2012 08:06 # +1
bormand 28.06.2012 08:49 # +1
Для unsigned:
Для signed:
Fai 28.06.2012 16:09 # −2
Для сравнения 1 и 0 например 0х8000 операций надо.
Fai 28.06.2012 16:14 # 0
O(f(x) + const) = O(f(x)).
А с практической точки зрения эта const может вылиться в смертельные тормоза.
bormand 28.06.2012 16:16 # +2
Окай. a ^= 0x8000, b ^= 0x8000. Результат такой же. Надеюсь, что хотя бы xor там есть...
Fai 28.06.2012 16:30 # 0
Так что многие простые сравнения будут очень и очень долго производиться.
Например сравнение 1 и 0 раньше требовало 0 декрементов, а теперь это будет сравнение 0x8001 и 0x8000, так что декрементов будет намного больше.
bormand 28.06.2012 16:36 # +1
roman-kashitsyn 28.06.2012 16:36 # +7
bormand 28.06.2012 16:37 # +1
Fai 28.06.2012 16:44 # 0
Больше хотелось показать что без прибавления числа в начале алгоритм эффективнее для чисел близких к 0.
Тут выбор того сколько прибавлять будет зависеть от того, какие числа чаще должны сравниваться.
bormand 28.06.2012 16:55 # 0
Зато не эффективнее для отрицательных...
> будет зависеть от того, какие числа чаще должны сравниваться.
Ну да, тут согласен.
Fai 28.06.2012 16:37 # +1
Сложение инкрементом.
Умножение таким сложением.
Возведение в степень таким умножением.
Ну и посчитать 5^3
bormand 28.06.2012 17:08 # +2
movaxbx 28.06.2012 19:41 # +1
movaxbx 28.06.2012 19:47 # +2
bormand 29.06.2012 06:41 # +2
defecate-plusplus 29.06.2012 08:00 # +1
мне институтский ассемблер запомнился реализацией некоторых криптоалгоритмов, защищенных от атаки по времени и с обфускацией (любая ветка if обязана иметь примерно одинаковое количество тактов - независимость времени алгоритма от входных данных, при этом делать что то более осознанное и правдоподобное, чем nop) - было интересно, и как то надо было на асме читать конфигурационный файл, я запилил парсинг ini-подобного формата
после института ассемблер все равно не пригодился, но уж лучше его, чем ненужную машину тьюринга
bormand 29.06.2012 08:26 # 0
У нас и на лабах по прологу были тупые базы данных, и, внимание, вычисление функции через ряд(!), вместо того, чтобы попробовать порешать на нем какие-нибудь логические задачки... Что поделать, сибирская глубинка.
> реализацией некоторых криптоалгоритмов
Вот. Вот это действительно интересная лаба.
> более осознанное и правдоподобное, чем nop
А вот это, походу, уже не от атаки по времени, а от атаки замером потребляемого тока ;) К PC она, конечно, не применима, но вот к чипу с внешним питанием, типа той же симки - вполне реальна.
> после института ассемблер все равно не пригодился
Ну да, сам по себе он сейчас не особо нужен. Разве что для чтения дизасма... Но зато его изучение помогает разобраться в принципах работы компа.
roman-kashitsyn 29.06.2012 11:53 # +1
> сибирская глубинка
У нас пролога вообще не было. :( Город большой, но в плане образования не очень. Я, конечно, очень благодарен родному универу за бесплатное (в целом вполне неплохое) образование, которое получил, но минусов довольно много. ASM был, ковыряли всякие несложные задачки типа "распарсить и сложить числа, прочитанные с консоли". Хорошо хоть, что препод заставлял объяснять содержимое каждого регистра и кадра стека после каждой инструкции. С тех пор ассемблера особо не видел.
eth0 29.06.2012 13:12 # +2
guest 14.11.2015 14:36 # 0
guest 20.11.2015 07:34 # 0
guest 20.11.2015 15:07 # 0
guest 24.11.2015 09:42 # 0
UncleAli 29.06.2012 03:10 # +5
Fai 29.06.2012 14:58 # 0
UncleAli 29.06.2012 16:56 # 0
bormand 29.06.2012 17:10 # +1
Fai 29.06.2012 17:18 # 0
bormand 29.06.2012 17:33 # 0