Подтвердить что ты не робот

Что означает присвоение ~ 0u переменной в С++?

Я понимаю, что 0u означает 0 без знака, но что означает ~ в начале? Означает ли это инверсию в этом случае или означает что-то еще?

4b9b3361

Ответ 1

Он указывает побитовое; все биты целого числа будут перевернуты, что в этом случае приведет к числу, где все биты равны 1.

Обратите внимание, что, поскольку он не имеет знака, если целое число расширяется во время назначения, расширенные биты будут равны 0. Например, если предположить, что unsigned short равно 2 байтам, а unsigned int равно 4:

unsigned short s = ~0u; // 0xFFFF
unsigned int i = s;     // 0x0000FFFF

Если вам нужно инвертировать биты некоторого общего числового типа T, вы можете использовать конструкцию ~(T(0)).

Ответ 2

Этот оператор лучше описан в стандарте C, чем в стандарте С++

4 Результат оператора ~ является поразрядным дополнением его (продвинутый) операнд (то есть каждый бит в результате устанавливается, если и только если соответствующий бит в преобразованном операнде не установлен). целые рекламные акции выполняются в операнде, и результат продвинутого типа. Если продвигаемый тип является неподписанным типом, выражение ~ E эквивалентно максимальному значению, представленному в этом тип минус E.

Таким образом, ~0u означает максимальное значение объекта типа unsigned int, когда каждый бит его внутреннего представления установлен в 1.

Рассмотрим с помощью оператора, что для установки, например, первых n бит в 1. Выражение будет выглядеть как

~( ~0u << n )

Если вы хотите установить n бит, начиная с позиции m, вы можете написать

~( ~0u << n ) << m

Ответ 3

Это означает побитовое не, которое переворачивает все биты целочисленного значения, предоставляя вам номер со всеми битами, установленными в 1.

(Assuming a 32 bit uint)
   0u
   00000000 00000000 00000000 00000000

   ~0u
   11111111 11111111 11111111 11111111

   3
   00000000 00000000 00000000 00000011

   ~3
   11111111 11111111 11111111 11111100

Если машина использует 2 дополнение для отрицательных целых чисел, то приведение ~0u к подписанному целое число эквивалентно -1. Подробнее об этом в вопросе Есть ли разница между -1 и ~ 0?.

Ответ 4

Он должен инвертировать значения в битах. Например:

+00000000000000000001

к

+11111111111111111110

Это то, что делает ~.