Então, eu estava apenas tentando um pouco de manipulação em C ++. Aqui está o que eu tentei:
int a = 1<<2;
cout<<a;
Isso fornece a saída como 4
.
int a = 1<<3;
cout<<a;
Isso fornece a saída como 8
Mas quando eu faço:
int a = 1<<2 + 1<<3;
cout<<a;
Dá a saída como 64
. Por quê então?
Eu também tentei:
int a = 1<<2;
int b = 1<<3;
cout<<a + b;
O que fornece a saída conforme 12
o esperado.
c++
bit-manipulation
Ron Howard
fonte
fonte
<<
tem precedência mais baixa do que+
,1<<2 + 1<<3
=1<<(2 + 1)<<3
1<<2 + 1<<3
é realmente1<< 2+1 <<3
. Não se deixe enganar pelo espaço em branco.Respostas:
Isso ocorre porque a adição tem uma precedência maior do operador do que o deslocamento de bits. Em outras palavras, seu segundo exemplo é equivalente a
1 << (2 + 1) << 3
Além disso, como o deslocamento de bits é associativo à esquerda, é o mesmo que
(1 << (2 + 1)) << 3
. Isso simplifica para8 << 3
, o que é64
.fonte
É sobre a precedência do operador
+
tem precedência mais alta que os operadores de turno, portanto,1<<2 + 1<<3
é feito como1 << (2 + 1) << 3
é semelhante a1 << 6 == 64
(já que<<
é associativo à esquerda , como você pode ver na tabela de precedência no link acima)É também por isso que
cout<<a + b;
funciona, porque é analisado comocout<<(a + b);
, caso contrário, você receberá alguns erros como "não é possível adicionar um número a um fluxo"fonte
O
+
operador tem uma precedência mais alta que o<<
operador, então aqui está essa linha que está sendo avaliada:Você deve agrupá-lo dessa maneira com parênteses:
fonte