Programação moderna em C - Aula 8: Operadores bit-a-bit

Поділитися
Вставка
  • Опубліковано 27 лис 2024

КОМЕНТАРІ • 32

  • @kretcheu2001
    @kretcheu2001 7 років тому +40

    As suas aulas só tem um problema: acabam logo!
    Parabéns pelo curso.

  • @renatoac1975
    @renatoac1975 2 роки тому

    Excelente aula Fernando, parabéns !!!

  • @jigoloharmegiddo
    @jigoloharmegiddo 4 роки тому +3

    Como não se tornar um escovador de bits absorvendo um conteúdo desse? Hahaha
    Fico louco, mano! Muito bom! :D

  • @MsJuanH
    @MsJuanH 5 років тому +1

    Agora eu achei o que estava procurando... Você está de parabéns...

  • @carlosneri4424
    @carlosneri4424 6 років тому +1

    Mercês é o melhor! PArabens!

  • @FredericoPissarra
    @FredericoPissarra 7 років тому +31

    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).

    • @gabrielc6839
      @gabrielc6839 7 років тому

      Pode explicar sobre o " bit mais significativo e menos significativo " ..(?)

    • @FredericoPissarra
      @FredericoPissarra 7 років тому +21

      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".

    • @dbvisrael
      @dbvisrael 6 років тому +1

      bem prática a explicação, valeu!

  • @derxs2178
    @derxs2178 7 років тому +2

    Ótima vídeo-aula! Parabéns pelo trabalho bem feito, vocês aí do canal!

  • @antoniodaniel8983
    @antoniodaniel8983 3 роки тому

    ótima aula revendo tudo

  • @FredericoPissarra
    @FredericoPissarra 7 років тому +20

    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.

    • @UnanTec
      @UnanTec 7 років тому +1

      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).

    • @FredericoPissarra
      @FredericoPissarra 7 років тому +11

      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...

  • @elohimalves
    @elohimalves 4 роки тому

    Eu to aprendendo Java, mas essa aula serviu muito. Obrigado!

  • @mbissonho
    @mbissonho 7 років тому +1

    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!

    • @silva97
      @silva97 6 років тому

      Isso não é baixo nível... Pesquisa sobre Assembly que você vê a diferença enorme entre alto nível e baixo nível. ^-^

  • @firminodefaria
    @firminodefaria 7 років тому

    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?

  • @gustavomarinho9976
    @gustavomarinho9976 7 років тому

    Ontem quase que eu fui no facebook perguntar pq não tinha saido a video aula. Ai eu lembrei que era feriado kkkkk.

  • @race_Bannon
    @race_Bannon 4 роки тому

    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.

  • @pedrovinicius5128
    @pedrovinicius5128 3 роки тому +1

    vc poderia dar o comando 32a0 para digitar 32 zeros e 32a1 para digitar 32 número 1. Um pouco mais rápido né?

  • @jigoloharmegiddo
    @jigoloharmegiddo 4 роки тому +1

    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");
    }

    • @fabiokleis
      @fabiokleis 3 роки тому

      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

  • @junkeirahacker6772
    @junkeirahacker6772 4 роки тому

    aulas otimas ate guardando muita prima de dois anos consegui entender kkkkkkkkkk #vidanumtafacil

  • @estudianteelectrico6728
    @estudianteelectrico6728 6 років тому +1

    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?

    • @fayato4422
      @fayato4422 4 роки тому +1

      "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

  • @davidburil
    @davidburil 4 роки тому

    No minuto 18:09 foi falado sobre stream. Em que vídeo foi tratado esse assunto?

  • @pcold590
    @pcold590 6 років тому +1

    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
      @mentebinaria  5 років тому +2

      Não é orgulho! rsrs
      É que nessa VM não tem ambiente gráfico, mas usamos IDE’s em outros vídeos. 😉

    • @estudianteelectrico6728
      @estudianteelectrico6728 5 років тому

      @@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?

    • @CalangoBit
      @CalangoBit 5 років тому

      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!