Заключение в кавычки кода для вычислений целочисленного абсолютного значения (брюшной пресс), не переходя из http://graphics.stanford.edu/~seander/bithacks.html:
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
Запатентованное изменение:
r = (v ^ mask) - mask;
Что CHAR_BIT
и как использование это?
Вы должны знать, что этот код зависит от определяемого реализацией поведения правого битового сдвига для подписанных типов. gcc обещает всегда обеспечивать нормальное поведение (расширение знакового бита), но ISO C позволяет реализации обнулять верхние биты.
Один из способов решения этой проблемы:
#ifdef HAVE_SIGN_EXTENDING_BITSHIFT
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
#else
int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1);
#endif
Ваш Makefile
или config.h
и т. Д. Может определять HAVE_SIGN_EXTENDING_BITSHIFT
во время сборки в зависимости от вашей платформы.
CHAR_BIT
- это количество бит в char
. В наши дни почти все архитектуры используют 8 бит на байт, но это не всегда так. Некоторые старые машины использовали 7-битный байт.
Это можно найти в
.