Вот глупый пример:
Built-in Function: int __builtin_clz (unsigned int x)
Returns the number of leading 0-bits in x, starting at the most
significant bit position. If x is 0, the result is undefined.
Первая попытка:
int get_msb(int x) { return x ? __buildin_clz(x) == 0 : 0; }
Примечание: это особенность языка C, функции которого, задающие параметры int
или unsigned int
, могут вызываться с другим типом без предупреждения. Но это, вероятно, связано с преобразованием - стандарт C ++ 4.7.2 гласит:
Если тип назначения является беззнаковым, результирующее значение является целочисленным с наименьшим числом без знака, соответствующим исходному целому числу (по модулю 2n, где n - число битов, используемых для представления типа без знака). [Примечание: в представлении дополнения до двух это преобразование является концептуальным, и в битовой комбинации нет изменений (если нет усечения). ]
Что означает, что битовая комбинация может быть изменена, если она не является представлением дополнения до двух, что также помешало бы надежной работе этого «решения». : - (
Комментарий Криса ниже предоставляет решение (включенное здесь как функция, а не макрос препроцессора):
int get_msb(int x) { return x ? __buildin_clz(*(unsigned*)&x) == 0 : 0; }