Я пытаюсь использовать побитовые операторы (! ~ & ^ | + << >>) в C, чтобы добиться умножения на 4, а также исправления для положительного и отрицательного переполнения, возвращая значения Max и Minimum соответственно. Например,
Function(0x10000000) = 0x40000000
Function(0x20000000) = 0x7FFFFFFF
Function(0x80000000) = 0x80000000
Мой основной метод заключается в проверке знака продукта, чтобы найти, ожидали ли он изменения.
int funcMultBy4(int x){
int signedBit=(x>>31);
int minValue= 1<<31;
int xtimes4= x<<2;
int maxValue= (x ^ xtimes4) >> 31;
int saturate= maxValue & (signedBit ^ ~minValue);
return saturate | (xtimes4 ^ ~maxValue) ;
}
В настоящее время при умножении 0x7fffffff я получаю -1, ачем ожидалось 0x7FFFFFFF. Я понимаю, что, возможно, где-то необходим сдвиг на 1, но я не могу найти свою ошибку.