Я пишу функцию C, которая принимает параметр n и возвращает int с битовым представлением n 1, за которым следует 0, чтобы заполнить тип данных (всего 32 бита).Мой код в настоящее время выглядит следующим образом:
int upperBits(int n) {
int retval = 0 - 1;
int shift = 32 - n;
retval = retval << shift;
return retval;
}
Этот код завершается ошибкой, когда n = 0, давая возвращаемое значение -1, представленное 32 1, а не 0. Когда, однако, я заменяю shift налитерал:
int upperBits(int n) {
int retval = 0 - 1;
int shift = 32 - n;
retval = retval << 32;
return retval;
}
Код работает правильно, возвращая 0. Я использовал операторы print, чтобы проверить, что shift = 32, когда функция вызывается с n = 0, поэтому я не понимаю, почему они ведут себя по-разному.Чем обусловлено это различие и как я могу его обойти?
Если это уместно, код выполняется на компьютере с Linux и компилируется с помощью gcc.Я должен использовать прямой код только с этими операторами: !
˜
&
ˆ
|
+
<<
>>
РЕДАКТИРОВАТЬ: Я все еще не знаю точнов чем проблема, или элегантное решение, но этот обходной путь эффективен:
int upperBits(int n) {
int retval = 0 - 1;
int shift = 32 - n;
int isnull = !(n);
printf ("%x %x %x \n", retval, shift, n);
retval = retval << (shift - isnull);
retval = retval << isnull;
printf ("%x %x %x \n", retval, shift, n);
return retval;
}