Atenção para um problema em potencial com o SHIFT para a direita (>>). C não faz distinção entre SHIFT LÓGICO e SHIFT ARITMÉTICO. O segundo leva em consideração o bit de mais alta ordem do valor (o bit de sinal) se o tipo for sinalizado. Isso significa que >> pode tanto ser traduzido pelo compilador por um shift lógico ou aritmético, o que pode dar resultado diferente do esperado. A especificação nos diz que, este caso, é "dependente de implementação". Só para esclarescer: SHIFT LÓGICO sempre complementa com zeros. SHIFT ARITMÉTICO copia o bit de mais alta ordem. Ambos quando o shift é feito para a direita!!! No shift para a esquerda ambos os shifts também existem, mas causam sempre a inserção de zeros à direita... Então... evitem usar shifts com tipos sinalizados (char, short, int, long e long long). Prefira os tipos "unsigned" (onde o SHIFT ARITMÉTICO jamais será usado).
Considere que você tem R$ 1001,00 no bolso... Se você perder R$ 1,00 não será o fim do mundo, já que você ainda terá R$ 1000,00... Mas, se você perder o '1' mais à esquerda, ficará com apenas R$ 1,00 no bolso. O 1 do lado mais à direita (R$ 1,00) "signfica menos" e o 1 do lado mais à esquerda (R$ 1000,00) "significa mais".... Mesma coisa para valores binários... o bit 0 é o "menos significativo" e o bit mais à esquerda (o bit 31, no caso de um 'int', por exemplo) é o "mais significativo".
Como o Fernando falou, a notação 0b para tipos literais em binário é uma EXTENSÃO de alguns compiladores... Não faz parte do padrão... Recomendo NÃO usar. Prefira a notação hexadecimal ou octal.
Frederico Pissarra Ainda estou começando nisso, mas pelo que tenho observado, se for esperar pelo *"padrão"* para se começar a usar um recurso não suportado pela linguagem C, só se usa tal recurso anos e anos depois dele ter sido implementado pela primeira vez. Acho realmente incrível que existam notações oficiais para o octal (base 8) e para o hexadecimal (base 16), mas não exista uma notação oficial para o binário (base 2).
Não é surpresa alguma: algarismos hexadecimais nada mais são que o agrupamento de 4 bits e, no caso de octal, o agrupamento de 3 bits. A notação binária raramente é usada _de facto_. Padrões existem por alguns motivos: Para que todos usem recursos bem documentados e para que, na medida do possível, seu código possa ser portado para várias plataformas. É claro que é opção do desenvolvedor usar um padrão ou não, mas quando se quer usar um recurso não padronizado, assume-se o risco de que bugs apareçam onde não deveriam existir. Por isso usei "Recomendo" e "Prefira" na sentença lá em cima...
Parabéns pelo curso. Se continuar a explorar assuntos e capacidades de baixo nível da linguagem vai ser um diferencial, pois é difícil encontrar alguém explicando até esse nível. Seria muito útil pra mim kk. E se pudesse dar um projeto prático, seria perfeito. Mas, de qualquer forma, parabéns pela iniciativa!
Parabéns e muito obrigado pelas aulas. São muito boas!!! Realmente o único defeito é que acabam muito rápido. Você tem uma ementa para o curso? Se sim, poderia postar?
Aproveitando que o professor chamou parte da aula de "criptografia fraquinha" , fiz um comentário no C: // BRINCANDO COM CRIPTOGRAFIA. Daí, quando executei os comandos ESC, : X o C me pediu a chave criptográfica 2 vezes e o programinha ficou criptografado e só abre corretamente no VI informando a chave certa.
Verificando se um número é par ou ímpar com o operador bitwise AND (&): int valor; scanf("%d", &valor); printf((valor & 1) ? "Impar " : "Par "); Verificando o maior valor entre dois números com os operadores bitwise XOR (^) e AND (&): int max(int x, int y) { return ((x ^ y) & - (x > y)); } Fazendo a troca (swap) de dois valores sem utilizar uma variável auxiliar com o operador bitwise XOR (^): int x = 10; int y = 12; x = x ^ y; // x = 1010 ^ 1100 = 0110 (ou 6 em decimal) y = x ^ y; // y = 0110 ^ 1100 = 1010 (ou 10 em decimal) x = x ^ y; // x = 0110 ^ 1010 = 1100 (ou 12 em decimal) Agora x = 12 e y = 10. Convertendo valor decimal para binário com os operadores bitwise LEFT RIGHT (>>) e AND (&): int n, bits, x; scanf("%d", &n); for(bits = 31; bits >= 0; bits--){ x = n >> bits; printf((x & 1) ? "1" : "0"); }
Cara eu sei que ja se passou um bom tempo, mas por favor voce poderia dar uma explicação para esta funcao. Verificando o maior valor entre dois números com os operadores bitwise XOR (^) e AND (&): int max(int x, int y) { return ((x ^ y) & - (x > y)); } Rodei aqui tentei entender mas ta dificil. #obs: as outras eu compreeendi
Ola professor. Ótimo conteudo informativo. Parabéns!! Estou utilizando o DEV C++4.9.9.2 e aceita como entrada int a = 0x8E; porem nao aceita int a = 0b10001110, e nenhum valor em binario. Emitindo o erro invalid suffix "b10001110" on integer constant. Porque?
"Como o Fernando falou, a notação 0b para tipos literais em binário é uma EXTENSÃO de alguns compiladores... Não faz parte do padrão... Recomendo NÃO usar. Prefira a notação hexadecimal ou octal. " - Frederico Pissarra, comentário acima
usar o terminal pra programar é doloroso mano só estende seus videos, larga de lado o orgulho e baixa uma IDE nois já sabemos que voce sabe compilar e executar no terminal kkkk
@@mentebinaria Ahhhhh nao meu... fiz uma pergutna a 7 meses atras e vc nao respondeu, porem a um mes responde a uma provocacao do dony? Nao seria mais interessante responder as duvidas de quem acompanha seu canal???? A sete meses atras perguntei. "Ola professor. Ótimo conteudo informativo. Parabéns!! Estou utilizando o DEV C++4.9.9.2 e aceita como entrada int a = 0x8E; porem nao aceita int a = 0b10001110, e nenhum valor em binario. Emitindo o erro invalid suffix "b10001110" on integer constant. Porque?" E revendo hoje 28/02/19 me veio outra duvida que em carona na mesma duvida do Kellvin Romano de 4 meses atras. Se b é a negacao bit a bit de a e o primerio bit é sinal do maior numero negativo, porque nao imprime entao o numero -2147483648, e imprime -1? Poderia auxiliar nas duvidas?
De fato ele "dificultou" fazendo o "for" na linha de comando do Shell. Na verdade poderia, de dentro do vi, ter executado 32i0 e 32i1 para escrever 32 zeros e 32 uns!
As suas aulas só tem um problema: acabam logo!
Parabéns pelo curso.
Excelente aula Fernando, parabéns !!!
Como não se tornar um escovador de bits absorvendo um conteúdo desse? Hahaha
Fico louco, mano! Muito bom! :D
Agora eu achei o que estava procurando... Você está de parabéns...
Mercês é o melhor! PArabens!
Atenção para um problema em potencial com o SHIFT para a direita (>>). C não faz distinção entre SHIFT LÓGICO e SHIFT ARITMÉTICO. O segundo leva em consideração o bit de mais alta ordem do valor (o bit de sinal) se o tipo for sinalizado.
Isso significa que >> pode tanto ser traduzido pelo compilador por um shift lógico ou aritmético, o que pode dar resultado diferente do esperado. A especificação nos diz que, este caso, é "dependente de implementação".
Só para esclarescer: SHIFT LÓGICO sempre complementa com zeros. SHIFT ARITMÉTICO copia o bit de mais alta ordem. Ambos quando o shift é feito para a direita!!! No shift para a esquerda ambos os shifts também existem, mas causam sempre a inserção de zeros à direita...
Então... evitem usar shifts com tipos sinalizados (char, short, int, long e long long). Prefira os tipos "unsigned" (onde o SHIFT ARITMÉTICO jamais será usado).
Pode explicar sobre o " bit mais significativo e menos significativo " ..(?)
Considere que você tem R$ 1001,00 no bolso... Se você perder R$ 1,00 não será o fim do mundo, já que você ainda terá R$ 1000,00... Mas, se você perder o '1' mais à esquerda, ficará com apenas R$ 1,00 no bolso.
O 1 do lado mais à direita (R$ 1,00) "signfica menos" e o 1 do lado mais à esquerda (R$ 1000,00) "significa mais".... Mesma coisa para valores binários... o bit 0 é o "menos significativo" e o bit mais à esquerda (o bit 31, no caso de um 'int', por exemplo) é o "mais significativo".
bem prática a explicação, valeu!
Ótima vídeo-aula! Parabéns pelo trabalho bem feito, vocês aí do canal!
ótima aula revendo tudo
Como o Fernando falou, a notação 0b para tipos literais em binário é uma EXTENSÃO de alguns compiladores... Não faz parte do padrão... Recomendo NÃO usar. Prefira a notação hexadecimal ou octal.
Frederico Pissarra Ainda estou começando nisso, mas pelo que tenho observado, se for esperar pelo *"padrão"* para se começar a usar um recurso não suportado pela linguagem C, só se usa tal recurso anos e anos depois dele ter sido implementado pela primeira vez. Acho realmente incrível que existam notações oficiais para o octal (base 8) e para o hexadecimal (base 16), mas não exista uma notação oficial para o binário (base 2).
Não é surpresa alguma: algarismos hexadecimais nada mais são que o agrupamento de 4 bits e, no caso de octal, o agrupamento de 3 bits. A notação binária raramente é usada _de facto_.
Padrões existem por alguns motivos: Para que todos usem recursos bem documentados e para que, na medida do possível, seu código possa ser portado para várias plataformas. É claro que é opção do desenvolvedor usar um padrão ou não, mas quando se quer usar um recurso não padronizado, assume-se o risco de que bugs apareçam onde não deveriam existir. Por isso usei "Recomendo" e "Prefira" na sentença lá em cima...
Eu to aprendendo Java, mas essa aula serviu muito. Obrigado!
Parabéns pelo curso. Se continuar a explorar assuntos e capacidades de baixo nível da linguagem vai ser um diferencial, pois é difícil encontrar alguém explicando até esse nível. Seria muito útil pra mim kk. E se pudesse dar um projeto prático, seria perfeito. Mas, de qualquer forma, parabéns pela iniciativa!
Isso não é baixo nível... Pesquisa sobre Assembly que você vê a diferença enorme entre alto nível e baixo nível. ^-^
Parabéns e muito obrigado pelas aulas. São muito boas!!! Realmente o único defeito é que acabam muito rápido.
Você tem uma ementa para o curso? Se sim, poderia postar?
Ontem quase que eu fui no facebook perguntar pq não tinha saido a video aula. Ai eu lembrei que era feriado kkkkk.
Aproveitando que o professor chamou parte da aula de "criptografia fraquinha" , fiz um comentário no C: // BRINCANDO COM CRIPTOGRAFIA. Daí, quando executei os comandos ESC, : X o C me pediu a chave criptográfica 2 vezes e o programinha ficou criptografado e só abre corretamente no VI informando a chave certa.
vc poderia dar o comando 32a0 para digitar 32 zeros e 32a1 para digitar 32 número 1. Um pouco mais rápido né?
Verdade. Obrigado pela dica!
Verificando se um número é par ou ímpar com o operador bitwise AND (&):
int valor;
scanf("%d", &valor);
printf((valor & 1) ? "Impar
" : "Par
");
Verificando o maior valor entre dois números com os operadores bitwise XOR (^) e AND (&):
int max(int x, int y)
{
return ((x ^ y) & - (x > y));
}
Fazendo a troca (swap) de dois valores sem utilizar uma variável auxiliar com o operador bitwise XOR (^):
int x = 10;
int y = 12;
x = x ^ y; // x = 1010 ^ 1100 = 0110 (ou 6 em decimal)
y = x ^ y; // y = 0110 ^ 1100 = 1010 (ou 10 em decimal)
x = x ^ y; // x = 0110 ^ 1010 = 1100 (ou 12 em decimal)
Agora x = 12 e y = 10.
Convertendo valor decimal para binário com os operadores bitwise LEFT RIGHT (>>) e AND (&):
int n, bits, x;
scanf("%d", &n);
for(bits = 31; bits >= 0; bits--){
x = n >> bits;
printf((x & 1) ? "1" : "0");
}
Cara eu sei que ja se passou um bom tempo, mas por favor voce poderia dar uma explicação para esta funcao.
Verificando o maior valor entre dois números com os operadores bitwise XOR (^) e AND (&):
int max(int x, int y)
{
return ((x ^ y) & - (x > y));
}
Rodei aqui tentei entender mas ta dificil. #obs: as outras eu compreeendi
aulas otimas ate guardando muita prima de dois anos consegui entender kkkkkkkkkk #vidanumtafacil
Ola professor. Ótimo conteudo informativo. Parabéns!! Estou utilizando o DEV C++4.9.9.2 e aceita como entrada int a = 0x8E; porem nao aceita int a = 0b10001110, e nenhum valor em binario. Emitindo o erro invalid suffix "b10001110" on integer constant. Porque?
"Como o Fernando falou, a notação 0b para tipos literais em binário é uma EXTENSÃO de alguns compiladores... Não faz parte do padrão... Recomendo NÃO usar. Prefira a notação hexadecimal ou octal. " - Frederico Pissarra, comentário acima
No minuto 18:09 foi falado sobre stream. Em que vídeo foi tratado esse assunto?
usar o terminal pra programar é doloroso mano só estende seus videos, larga de lado o orgulho e baixa uma IDE nois já sabemos que voce sabe compilar e executar no terminal kkkk
Não é orgulho! rsrs
É que nessa VM não tem ambiente gráfico, mas usamos IDE’s em outros vídeos. 😉
@@mentebinaria Ahhhhh nao meu... fiz uma pergutna a 7 meses atras e vc nao respondeu, porem a um mes responde a uma provocacao do dony?
Nao seria mais interessante responder as duvidas de quem acompanha seu canal???? A sete meses atras perguntei.
"Ola professor. Ótimo conteudo informativo. Parabéns!! Estou utilizando o DEV C++4.9.9.2 e aceita como entrada int a = 0x8E; porem nao aceita int a = 0b10001110, e nenhum valor em binario. Emitindo o erro invalid suffix "b10001110" on integer constant. Porque?"
E revendo hoje 28/02/19 me veio outra duvida que em carona na mesma duvida do Kellvin Romano
de 4 meses atras. Se b é a negacao bit a bit de a e o primerio bit é sinal do maior numero negativo, porque nao imprime entao o numero -2147483648, e imprime -1? Poderia auxiliar nas duvidas?
De fato ele "dificultou" fazendo o "for" na linha de comando do Shell. Na verdade poderia, de dentro do vi, ter executado 32i0 e 32i1 para escrever 32 zeros e 32 uns!