Для моей C вычисления, мне нужен тип знака (ассоциированный оператор является приемлемым), что можно сделать следующее:C: нужен тип «знак»
type sign_t = -1 | 0 | 1
integer mult_sign(integer i, sign_t s)
{
switch (s) {
case -1: return -i;
case 0: return 0;
case 1: return i;
}
}
Разъяснение: Значение знака не известный во время компиляции!
В настоящем время, я использую C signed
сек с целочисленным значением -1
, 0
, 1
, соответственно, и операция представляет собой С умножением myint * mysign
. Но мне интересно, имеет ли это последствия для производительности: для каждой операции с несколькими знаками используется аппаратное умножение, которое может быть медленнее, чем отрицание | установлен в 0 | не прикасайтесь.
Что было бы идеальным способом сделать это в C?
Что было бы идеальным способом, если бы мы убрали значение 0 из знаковых значений (поэтому допустимы только -1 и 1)?
Архитектура конкретных хаков/стандартного несоответствия очень хорошо, если вы скажете мне, где они находятся.
Целочисленное умножение, скорее всего, будет быстрее, чем разветвление (что и подразумевает блок «switch») ... –
Из того факта, что вы не указали на предсказание ветвей в своем кратком бессвязном представлении о производительности, я заключаю, что вы не следует беспокоиться о производительности на этом уровне (т. е. о микро-оптимизации). – delnan
Конечно, я бы не хотел реализовывать это с ветвлением. Как вы видите, этот вопрос связан с битовыми манипуляциями. И да, я хочу сделать микро-оптимизацию. Программа http://spoj.com/problems/BULK, и уже у меня есть хороший алгоритм и одна из самых быстрых программ. –