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
0u
significa 0 sem assinatura, mas o que faz o ~
no início significa? Significa inversão neste caso ou significa outra coisa?
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))
.
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
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?.
É inverter os valores em bits. Por exemplo:
00000000000000000001
A
11111111111111111110
Isto é o que~
faz.