Отрицание положительного числа в дополнении 2 выполняется путем отмены всех битов и последующего добавления 1 к результату. Например, чтобы получить -4 из 4, вы должны сделать:
4 = 000...0100 in binary. ~4 = 111...1011. -4 = 111...1100.
То же самое, чтобы поменять знак.
Чтобы вы могли сделать это:
(~((x << 7) - (x << 4))) + 1
.
Не обязательно красивее, но быстрее, если мы рассмотрим побитовые операции быстрее, чем арифметические операции (особенно умножение) и игнорируем оптимизацию компилятора.
Не то чтобы я говорил, что вы должны это делать, потому что вы не должны. Хотя об этом полезно знать.