WxPython, bitwise operator, permissão octal


Quando eu estava dando uma “zoiadinha” em como montar uma(s) janela(s) em wxPython, acabei me deparando demais com o operador “|”, geralmente chamado de PIPE.
Mas para que serve este operador ?
Ele é um operador do grupo dos Bitwse Operators do python, para operações em binário.

Leia mais sobre este assunto aqui: http://pt.wikipedia.org/wiki/L%C3%B3gica_bin%C3%A1ria

Pois bem, então dei mais uma pesquisada para conhecer mais nosso amiguinho novo operador.
Ele é um operador OR, ou seja, faz a operaçõ de OU, em todos os bits de um numero e retorna o resultado.

Mais ou menos assim…

>>> bin(10) #binario de 10
'0b1010'
>>> bin(17) #binario de 17
'0b10001'
>>>
>>> 10|17
27
>>> bin(27) #binario de 27
'0b11011'
>>>

Ou seja, 10 é 1010 en binário, e 17 é 10001 em binário, sendo assim:

01010
10001 OU
-----
11011

27 em binário é 11011 ! Pois se qq um dos bits for 1, o resultado é 1 ! hehehe

Aí então, voltando ao wxPython, pensei: como são utilizados/verificados estes itens passados na chamada do método com este operador OU binário ?

Mais uma vez pesquisei e dei uma lida e testei e cheguei a conclusão que era verificado cada opção com o operador “&” ( AND ), como o exemplo abaixo. Agora me digam: Por quê o AND binário me retorna corretamente se um item foi passado no parâmetro chamado ‘par’ do exemplo abaixo ? (comentem para responder)

#!/bin/python
# -*- encoding: utf8 -*-
import timeit

R = 1
W = 2
X = 4

#======================================= Utilizacao de Binarios
def funcao(par):
    if R & par:
        print "Tem leitura"
    else:
        print "NAO !"

tb = timeit.Timer()
    
funcao( R|W )
funcao( R|W|X )
funcao( R|X )
funcao( W|X )
funcao( R )
funcao( W )
funcao( X )

tempo1 = tb.timeit()

#======================================= Utilizacao de Listas
def funcao2(lst):
    if R in lst:
        print "Tem leitura"
    else:
        print "NAO !"
        
tl = timeit.Timer()
    
funcao2( [R,W] )
funcao2( [R,W,X] )
funcao2( [R,X] )
funcao2( [W,X] )
funcao2( [R] )
funcao2( [W] )
funcao2( [X] )

tempo2 = tl.timeit()

print tempo1
print tempo2

E então já aproveitei para fazer duas coisas mais:
1- comparar a performance da verificação binária que citei acima com o mesmo tipo de verificação, só que com listas
2- mostrar como se calcula o tempo de execução de trechos de código.

No exemplo temos as variaveis R,W,X, exemplificando o sistema de permissões octal do Linux, e como se verificar isto quando se precisa. Ali vemos que basta acrescentar ou retirar opções opções na passagem dos parâmetros, juntamente com o operador “|”, que dentro da função conseguiremos verificar se 1 item está presente.

Aí fica minha pergunta, me digam um bom exemplo de utilização deste tipo de comparação binária, sendo que é até mesmo mais lenta que a com listas ?

Um abraço…

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s