• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

andre_mz

[Dúvida] Sinais de operações

19 mensagens neste tópico

Olá,

Já tentei perceber mas não consigo mesmo.

Disseram-me que estava relacionado com binários mas, sinceramente, não percebo dessa matéria.

Alguém me poderia ajudar no significado destes sinais? E explicar o porquê daqueles resultados nos "Examples"?

DvidaPython.jpg

Muito obrigado! :fartnew2:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O x//y basicamente é o equivalente a este f(x, y):

import math
f = lambda x,y: math.floor(x/y)

Isto é o mesmo que quando tens em matemática que D/d = Q+r (dividendo / divisor = quociente + resto), o // retorna-te o quociente. Ou seja, x/y = (x//y)+((x%y)/d).

Os bit shifts podes ver na mesma página que as bitwise operations da wikipedia: http://en.wikipedia.org/wiki/Bitwise_operation

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é Q = R + (divisor/dividendo)? ;)

De qualquer das maneiras, obrigado.

Mas uma coisa:

Isso não é a mesma coisa que fazer uma divisão simples?

Por exemplo, 4/3=1 e 4.0/3.0=1.33333 ou lá o que é.

Então, qual a diferença entre fazer 4//3.0 ou 4.0/3.0?

Muito obrigado.

Vou ler isso dos bit shifts! :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é Q = R + (divisor/dividendo)? :P

Quando me referi a r estava a pensar em r/d e Q como sendo o resultado da divisão inteira. D/d = Q+r/d. O que tu dizes só é verdade se o Q não for uma divisão inteira.

Isso não é a mesma coisa que fazer uma divisão simples?

Por exemplo, 4/3=1 e 4.0/3.0=1.33333 ou lá o que é.

Então, qual a diferença entre fazer 4//3.0 ou 4.0/3.0?

A diferença é que o / tem um comportamento diferente consoante o datatype dos valores. Se usares um / com 2 inteiros, ele vai-te fazer uma divisão inteira, isto é, 4/3 = 1, mas se pelo menos um dos valores for um float, já não é feita uma divisão inteira, mas sim a dita normal: 4.0/3 = 4/3.0 = 4.0/3.0 = 1.(3). Usando o //, estás a dizer expressamente que queres divisão inteira, seja com ints ou floats.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usando o //, estás a dizer expressamente que queres divisão inteira, seja com ints ou floats.

Está tudo dito, muito obrigado.

Relativamente àquela parte em que dizes que o que eu disse só é verdade se o quociente não for uma divisão inteira, não percebi muito bem, porque sempre dei Q = R + (d/D) na escola, e nunca D/d = Q+r/d. :P

Muito obrigado pela ajuda!! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na escola quando se refere a quociente, nunca se refere ao quociente de uma divisão inteira, mas sim duma divisão dita normal. Isto é, na escola tu fazes

45.000      |8

  50        5.625

    20

      40

      0

E dizes que D = 45, d = 8, r = 0, Q = 5.625. No entanto, quando estás a falar em divisão inteira, fazes simplesmente:

45        |8

  5      5

E tens D = 45, d = 8, r = 5, Q = 5. Ou seja, Q*d+r = D <=> Q+r/d = D/d

Esta última equação em Python pode ser escrita assim: D//d + D%d = D/d (considerando que estamos a falar em floats).

O que tu dás na escola é que o quociente de uma divisão de d por D é igual à soma de um R com o resultado da divisão inteira de d por D, que é o mesmo que dizeres que a divisão inteira de d por D (Qdi) é Q (5.625 no exemplo de cima) - R (r/d = 5/8 = 0.625).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes-me explicar melhor o que significa o módulo? (%) E os Left's e Right's Shifts? Não percebi muito bem.

Os Bit-wises e os Booleans, penso que já entendi como funcionam, mais ou menos, mas podes-me explicar melhor a sua utilização? É que ainda não encaxei muito bem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O módulo é o resto da divisão inteira. No 2o exemplo que dei no post anterior, é o 5 ® que está debaixo do 45.

Em relação aos shifts e bitwise operations, nunca usei, pelo que não te posso explicar. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah, ok, muito obrigado! :P É muito mais simples do que o que eu pensava. :(

Ou seja, x/y = (x//y)+((x%y)/d).

Não percebo este d. (x//y)+((x%y)/d)

D//d + D%d = D/d

Nesta equação que me mostras aqui, esse d já não está presente.

Obrigado por toda a tua ajuda, tens-me ajudado bastante.

Peço a que quem tenha trabalhado com Bit-wises me explique o que perguntei, sff! :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para os bitwise pegas na representação binária e aplicas AND ou OR a cada par de bits. Nesse primeiro exemplo:

DEC 5 = BIN 101

DEC 3 = BIN 011

5 & 3 = 001 (Fica 1 onde ambos são 1 e 0 nos outros casos.)

Para o OR é análogo, mas fica 0 quando ambos são 0 e 1 nos outros casos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sobre o funcionamento das operações bit a bit, acho que no link que o djthyrax deu já explica bem e com figuras.

Vou dar antes um exemplo: imagina que tens 4 lâmpadas que podem estar ligadas ou desligadas. Para guardar o estado das lâmpadas, uma opção óbvia é ter 4 variáveis, uma para cada lâmpada guardando o estado ligado/desligado (considera 1 = ligado, 0 = desligado).

No entanto, podemos usar as operações bit a bit para simplificar as coisas. Como só queremos saber se a lâmpada está ligada ou desligada, um bit chega para cada lâmpada. Assim, se todas as lâmpadas estiverem ligadas, podemos representar isto como 1111 ou 0000 se estiverem desligadas.

Assim, assumindo que já leste alguma coisa de binário, vamos tomar o bit mais à direita como o bit 0 e o bit mais à esquerda como o bit 3. Na verdade aquele valor 1111 não é mais do que 23 + 22 + 21 + 20 = 15.

Se o estado for 13 (ou seja, 1101), para sabermos se a 2ª lampada (bit 1) está ligada podemos usar o AND

1101 & 0010 = 0000 logo a lâmpada não está ligada. Contudo, se experimentássemos a lâmpada 3

1101 & 0100 = 0100 (um valor diferente de 0) logo a lâmpada está ligada.

isto não é mais do que fazer  13 & 2  e  13 & 4, respectivamente. Para obteres 21 ou 22 podes usar o shift lógico à esquerda:

1 = 1 << 0

2 = 1 << 1   

4 = 1 << 2

8 = 1 << 3

etc

Agora se pretendemos ligar a lâmpada 2 podemos usar o OR:

1101 | 0010 = 1111

1101 | 0100 = 1101 (o bit já estava a 1, mantém-se).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vamos ver se eu te consigo explicar isto.

Nesta equação que me mostras aqui, esse d já não está presente.

Essa equação está mal, falta o /d que pus na equação que citaste antes. :(

Na primária, quando te ensinam a fazer contas de dividir, dizem-te para dividires o dividendo pelo dividor até deixares de ter números para "puxar" para baixo para puderes continuar a dividir, certo? Isto é o fazeres x//y e ficares com o resto diferente de zero.

E dizem-te que quando esses números acabam e o resto é diferente de zero, podes adicionar casas decimais para continuares a dividir, certo? Ou seja, pegas no resto da divisão inteira (x%y) e divides pelo divisor para saberes quanto vale o resto. 45/8 = 40/8 + 5/8 = 5 + 5/8 = 5 + 0.625 = 5.625

O que está a bold é o x//y, o que está a sublinhado é o resto que fica de x/y (ou seja, x%y (que está a itálico)) sobre o divisor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

DEC 5 = BIN 101

DEC 3 = BIN 011

Que significam os DEC's?

Assim, assumindo que já leste alguma coisa de binário

Pois, esse é que é o problema, nunca li nada sobre binário. Mas vou aprendendo. :)

Estive a fazer várias experiências sem nunca conseguir perceber, ao certo, como funcionava isto, mas o teu "tutorial" ajudou-me bastante. Até cheguei a pensar que os números pares representavam o 0 e os ímpares o 1, não fazia sentido, também o achei.. que estupidez. :(

Também não sabia que o código se lia da direita para a esquerda. :(

Sobre o funcionamento das operações bit a bit, acho que no link que o djthyrax deu já explica bem e com figuras.

Li a página portuguesa da wikipédia e percebi mais ou menos como funcionava, não tinha percebido muito bem foi a utilização em si. Apenas percebi que a "mensagem", nos computadores, se processa sob 0's e 1's, mas isso é quase elementar. De qualquer maneira, vou experimentar ler a explicação inglesa, também. :confused:

Para obteres 21 ou 22 podes usar o shift lógico à esquerda:

1 = 1 << 0

2 = 1 << 1   

4 = 1 << 2

8 = 1 << 3

Podes-me explicar isto melhor? Não percebi o que é o shift lógico.

Existe alguma maneira de descobrirmos logo o código em bits de um número em vez de ter que fazer as contas de cabeça?

Na verdade aquele valor 1111 não é mais do que 23 + 22 + 21 + 20 = 15.

Isto ajudou-me bastante, lol, coisas de noob! :D

A tua explicação já me ajudou um bocado a entender para que servem os Bit-wises, agora tenho de ir tentar compreender os Booleans.

Bem, acho que não me esqueci de nada, muito obrigado aos dois! :)

[Edit]

E dizem-te que quando esses números acabam e o resto é diferente de zero, podes adicionar casas decimais para continuares a dividir, certo? Ou seja, pegas no resto da divisão inteira (x%y) e divides pelo divisor para saberes quanto vale o resto. 45/8 = 40/8 + 5/8 = 5 + 5/8 = 5 + 0.625 = 5.625

O que está a bold é o x//y, o que está a sublinhado é o resto que fica de x/y (ou seja, x%y (que está a itálico)) sobre o divisor.

Excelente, muito obrigado pela explicação.

Nem fazia sentido proceder de acordo com a outra equação. :)

>>> (45.0//8.0)+((45.0%8.0)/8.0)
5.625

Mas tinham de se considerar assim os números, não é? :P

E d=y? Right? :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que significam os DEC's?

Representação décimal do número (base 10) , BIN - representação binária.

Podes-me explicar isto melhor? Não percebi o que é o shift lógico.

Existe alguma maneira de descobrirmos logo o código em bits de um número em vez de ter que fazer as contas de cabeça?

Convém perceberes primeiro como se representa um número em binário. Considerando apenas números positivos, 13 = 01101 = 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20

um shift à esquerda significa deslocar os bits do número para a esquerda (vê a imagem na wikipedia) e é o mesmo que multiplicar por 2 (se for um deslocamento de uma unidade): 13 << 1 = 11010 = 1 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 26

um shift à direita é parecido mas tem o efeito oposto, divisões por 2: 13 >> 1 = 00110 = 0 * 24 + 0 * 23 + 1 * 22 + 1 * 21 + 0 * 20 = 6

Repara que o último bit se perdeu e o resultado é uma divisão inteira, em vez de 6.5 ficas com 6.

Isto tem mais que se lhe diga, mas depois podes investigar :(

A tua explicação já me ajudou um bocado a entender para que servem os Bit-wises, agora tenho de ir tentar compreender os Booleans.

O que queres dizer com "Booleans"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Convém perceberes primeiro como se representa um número em binário. Considerando apenas números positivos, 13 = 01101 = 0 * 24 + 1 * 23 + 1 * 22 + 0 * 21 + 1 * 20

Já tinha percebido como chegar lá mas, mais uma vez, obrigado pela atenção.

Em relação aos Left e Right Shifts também explicaste muito bem, obrigado, fiquei a perceber totalmente.

Só uma coisa, quando se faz um Left Shift, por exemplo, o bit mais à direita muda?

Tipo 11111 -> 11110?

Ou outro exemplo 11010 -> 10101?

E, por exemplo, se tivéssemos 13 << 2, andava duas casas decimais, certo?

O operador binário XOR, ou disjunção binária exclusiva devolve um bit 1 sempre que apenas um dos operandos é '1'

Enquanto ao Bit-Wise XOR, podes-me dizer se o que vou dizer a seguir está correcto?

No teu exemplo, para saber se a lâmpada 2 e 3 estavam acesas, utilizaste o AND. Deu 0 na 2 e 1 na 3 logo a 2 estava desligada e a 3 acesa.

Com o XOR daria o contrário? Assim, se o resultado fosse 1 a lâmpada estaria desligada e se o resultado do bit fosse 0 estaria ligada? Está correcto?

Enquanto aos Booleans:

DvidaPythonBooleans.jpg

[Edit] Muito obrigado por tudo! :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só uma coisa, quando se faz um Left Shift, por exemplo, o bit mais à direita muda?

Tipo 11111 -> 11110?

Os números são armazenados em variaveis de um determinado tamanho em número de bits. Assumindo que só tinhamos 5 bits era isso que acontecia, é adicionado um 0 à direita.

Ou outro exemplo 11010 -> 10101?

Por isso, aqui 11010 << 1 = 10100

E, por exemplo, se tivéssemos 13 << 2, andava duas casas decimais, certo?

Duas "casas" sim. 11010 << 2 = 01000

Enquanto ao Bit-Wise XOR, podes-me dizer se o que vou dizer a seguir está correcto?

No teu exemplo, para saber se a lâmpada 2 e 3 estavam acesas, utilizaste o AND. Deu 0 na 2 e 1 na 3 logo a 2 estava desligada e a 3 acesa.

Com o XOR daria o contrário? Assim, se o resultado fosse 1 a lâmpada estaria desligada e se o resultado do bit fosse 0 estaria ligada? Está correcto?

Yah, está correcto :(  O eXclusive OR é mais para testar exclusão mutua, ou seja, neste caso podiamos ver se 2 configurações de lampadas tinham lâmpadas acessas em comum.

0011 XOR 0100 = 0111

0011 XOR 0010 = 0001 (é diferente de 0011 OR 0010)

Enquanto aos Booleans:

...

Aqui é lógica convém pensares em condições

SE  a E b ENTAO
    faz kk coisa
SENAO
    faz outra coisa

o E é o operador AND. Para que a condição seja verdadeira, tanto o "a" como o "b" têm de ser verdadeiros.

Por outro lado, com o OR (ou) basta que uma delas seja verdadeira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Muito obrigado pela ajuda!

Se tiver mais algumas dúvidas, venho cá postar, espero que não se importem.

Aquilo das "casas decimais", enganei-me mesmo, não queria escrever decimais.

Obrigado. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

[Edit]

Excelente, muito obrigado pela explicação.

Nem fazia sentido proceder de acordo com a outra equação. :confused:

>>> (45.0//8.0)+((45.0%8.0)/8.0)
5.625

Mas tinham de se considerar assim os números, não é? :(

E d=y? Right? :biggrin:

print 2*"Sim, é isso mesmo.\n" :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora