Сбросить старший значащий бит в слове (int32) [C]

Как я могу отключить самый значимый установленный бит слова (например, 0x00556844 -> 0x00156844)? В gcc есть __ builtin_clz , но он просто считает нули, что мне не нужно. Кроме того, как мне заменить __builtin_clz на компилятор msvc или intel c?

Текущий мой код -

 int msb = 1<< ((sizeof(int)*8)-__builtin_clz(input)-1);
 int result = input & ~msb;

ОБНОВЛЕНИЕ: Хорошо, если вы говорите, что этот код довольно быстрый, я спрошу вас, как мне добавить переносимость к этому коду? Эта версия предназначена для GCC, но для MSVC и ICC?

5
задан osgx 15 May 2011 в 21:14
поделиться