Какая может быть польза от такой сложной функции для проверки, если переменная не равна нулю?

Я работаю над своей магистерской диссертацией (информатика) по коду, написанному для пост-квантовых безопасных подписей. Все это можно найти здесь, но здесь это не важно. В своей диссертации я попытался объяснить "простую" функцию, которая совсем не так проста.

Функция проверяет, отлична ли переменная от нуля в поле Галуа GF(16). (GF(16) здесь можно понимать как 4-битные целые числа без знака). Эта функция выглядит следующим образом:

static inline uint8_t gf16_is_nonzero(uint8_t a) {
    unsigned a4 = a & 0xf; // mask lowest 4 bits of a
    unsigned r = 0u - a4;  // set 4 high bits if a is nonzero
    r >>= 4;               // right-shift high bits into low bits
    return r & 1;          // return lowest bit
}

Я понял, как это работает, но не понимаю, почему эта функция должна быть такой сложной. Может ли быть для этого веская причина? Вескими причинами могут быть преимущества производительности или безопасности (например, защита от временных атак). Потому что, если нет таких преимуществ, не было бы разумнее написать эту функцию простым способом, например:

static inline uint8_t gf16_is_nonzero(uint8_t a) {
    return (a & 15) != 0;
}

РЕДАКТИРОВАТЬ

Этот код написан не мной, а крипто-исследователями, которые пытаются стандартизировать свой PQ-алгоритм в NIST.

Более простой подход для второго фрагмента кода был предложен TonyDelroy в комментариях.

1 ответ

Решение

Причина этого кода в том, что он не имеет филиалов.

Проверка условия обычно является дорогостоящей операцией, тогда как операции сложения, вычитания и поразрядные операции - нет.

Однако это преждевременная оптимизация. С участием-O3, первая функция компилируется в это:

andl    $15, %edi
negl    %edi
shrl    $31, %edi
movl    %edi, %eax
ret

Пока вторая функция компилируется в это:

andl    $15, %edi
setne   %al
ret

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

Другие вопросы по тегам