O que significa a atribuição de ~0u a uma variável em C++? [duplicado]

esta pergunta já tem uma resposta aqui:

  • O que faz a operadora? 3 respostas
Eu entendo.0u significa 0 sem assinatura, mas o que faz o ~ no início significa? Significa inversão neste caso ou significa outra coisa?

 24
c++
Author: Peter Mortensen, 2014-10-24

4 answers

Indica bitwise not; todos os bits no inteiro serão invertidos, o que neste caso produz um número onde todos os bits são 1.

Note que, uma vez que não é assinado, se o número inteiro for alargado durante a atribuição, os bits estendidos serão 0. Por exemplo, assumindo que unsigned short é 2 bytes e {[2] } é 4:

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

Se precisar de inverter os bits de algum tipo numérico Genérico T, então poderá usar a construção ~(T(0)).

 36
Author: cdhowie, 2014-10-24 19:58:13

Este operador está melhor descrito na norma C do que na norma C++

4 o resultado do operador ~ é o complemento bidirecional do seu (promovido) operand (isto é, cada bit no resultado é definido se e somente se o bit correspondente no operando convertido não estiver definido). O promoções inteiras são realizadas no operando, e o resultado tem o tipo promovido. Se o tipo promovido for um tipo sem sinal, o a expressão ~e é equivalente ao máximo valor representativo nesse tipo menos E.

Assim ~0u significa o valor máximo de um objecto do tipo int sem sinal quando cada bit da sua representação interna é definido como 1.

Considere usar o operador que para definir, por exemplo, os primeiros n bits para 1. A expressão parecerá com

~( ~0u << n )

Se quiser definir n bits a partir da posição m, então pode escrever

~( ~0u << n ) << m
 9
Author: Vlad from Moscow, 2014-10-24 20:06:35

Significa um bitwise não que inverte todos os bits do valor inteiro, dando-lhe um número com todos os bits definidos para 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

Se a máquina usa uma representação do complemento de a para inteiros negativos, então a fundição ~0u para um inteiro assinado é equivalente a -1. Mais sobre isso na questão de estouro de pilhahá alguma diferença entre -1 e ~0?.

 9
Author: Marco A., 2017-05-23 12:34:17

É inverter os valores em bits. Por exemplo:

00000000000000000001

A

11111111111111111110

Isto é o que ~ faz.
 3
Author: user3965261, 2014-10-25 23:23:22