Почему этот побитовый сдвиг вправо, похоже, не работает?
-
06-09-2019 - |
Вопрос
Может ли кто-нибудь объяснить мне, почему маска вообще не сдвинута вправо?Вы можете использовать что угодно вместо этого 1, и результат будет тот же.
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
Решение
Это проблема типа.Если вы приведете 0 к значению без знака, все будет в порядке:
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
Редактировать по комментариям:или используйте литеральную нотацию без знака, которая гораздо более лаконична.:)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
Другие советы
То, что происходит, это ~0
является int со всеми установленными битами (-1
).Теперь ты справа сдвигаешься на 1
;поскольку это -1
, расширение sign сохраняет установленный самый высокий бит, поэтому оно остается подписанным (это не то, что вы ожидали).Затем он преобразуется в неподписанный, как вы и ожидаете.
Попробуй это:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
RHS присваивания обрабатывается как количество со знаком, если вы не приведете его, что означает, что вы видели расширение знака без приведения.(Я также изменил ваше заявление о печати, чтобы отобразить число в шестнадцатеричном формате, который мне легче расшифровать.)
~0 - это строка из единиц.Оператор >> сдвигает их, и в значении со знаком он сдвигает единицы в биты более высокого порядка.Таким образом, вы можете сдвигать все, что хотите, результат не изменится.