[Tutorial] Truques com operadores especiais (bits operators)
#1

Quote:
TУPICO ATUALIZADO.

Novos cуdigos adicionados!

Ъltima atualizaзгo: 21:49 AM de 11/10/13

Esses truques sгo para deixar seus cуdigos mais velozes, mais bonitos e atй em alguns casos lhe poupar tempo. Sгo truques bбsicos, que podem ser usados em praticamente qualquer linguagem. Desde PHP а C++/C/Pawn






Operador NOT
normal:
pawn Code:
if(!var)
mйtodo Bruno:
pawn Code:
if(1 ^ (var & var))





admin || item != 5

Mйtodo comum:
pawn Code:
if( admin || item != 5))
mйtodo Will:
pawn Code:
if ( ( (admin & 1) | ( (admin ^ 7) & (item ^ 5) ) ) )
Mйtodo Dartakous
pawn Code:
if( (admin & 1) | (i ^ 5) )
Mйtodo Bruno. Sem |
pawn Code:
if((!((item ^ 5)) ^ !(!((item ^ 5)) & !((admin ^ 1)))))

Mйtodo Bruno. Sem !
pawn Code:
if(((1^((item ^ 5) & (item ^ 5))) ^ (1^(((1^((item ^ 5) & (item ^ 5))) & (1^((admin ^ 1) & (admin ^ 1)))) & ((1^((item ^ 5) & (item ^ 5))) & (1^((admin ^ 1) & (admin ^ 1))))))))
Mйtodo Bruno. Sem |

pawn Code:
if(~(~(item ^ 5) & ~admin))

Mйtodo Will. Sem |
pawn Code:
if ((admin) ^ ((admin ^ 0b11111111111) & (item ^ 5)))

Link original






valor absolute

pawn Code:
new x = -111;
x = floatabs(x);
para


pawn Code:
new x = -111;



    x = (x & 0x80000000) ? ~x+1 : x;






a >= b

PHP Code:
if( ((b-a) & 0x80000000) | !(b)) 
ou

PHP Code:
 if(!(((a-((a-b)&(a-b)>>31))^a)) | !(b)) 




a <= b

PHP Code:
if( ((a-b) & 0x80000000) | !(b)) 
ou

PHP Code:
 if(!!(((a-((a-b)&(a-b)>>31))^a)) | !(b)) 




checar negatividade

PHP Code:
if( 0
ou

PHP Code:
if( (0x80000000) ) // fasthest 




checar positividade

PHP Code:
if( 0
ou

PHP Code:
if( !(0x80000000) ) //fasthest 






a > b

PHP Code:
if(b
poderia ser feito

PHP Code:
 if(!(((a-((a-b)&(a-b)>>31))^a))) 
ou

PHP Code:
if( (b-a) & 0x80000000)//fasthest 



a < b && a != 0
PHP Code:
 if( (!!(((a-((a-b)&(a-b)>>31))^a))) & (0)) 
PHP Code:
if( ((a-b) & 0x80000000) & (0))// fastheat 



get min value

pawn Code:
if( a >= b) {
   maxs  = b;
}
else
{
  maxs = a;
}
ou

pawn Code:
maxs = min(a,b);
ou

pawn Code:
maxs = y ^ ((x ^ y) & -(!((y-x) & 0x80000000)));


get max value

pawn Code:
if( a >= b) {
   maxs  = a;
}
else
{
  maxs = b;
}
ou

pawn Code:
maxs = max(a,b);
ou

pawn Code:
maxs = (((a-((a-b)&(a-b)>>31))));

ou

pawn Code:
maxs = x ^ ((x ^ y) & -( (!((y-x) & 0x80000000) ))) //fasthest






a > b && a != 0

PHP Code:
 if( (!(((a-((a-b)&(a-b)>>31))^a))) & (0)) 
ou


PHP Code:
if( ((b-a) & 0x80000000) & (0)) 





a < b && a == 0

PHP Code:
 if( (!(((a-((a-b)&(a-b)>>31))^a))) & !(0)) 
ou

PHP Code:
if( ((a-b) & 0x80000000) & !(0)) 



a > b && a == 0
PHP Code:
 if( (!!(((a-((a-b)&(a-b)>>31))^a))) & !(0)) 




a < b
PHP Code:
if(b
poderia ser feito
PHP Code:
 if(!!(((a-((a-b)&(a-b)>>31))^a))) 
ou

pawn Code:
if(((a-b) & 0x80000000))






Igualdade com XOR
pawn Code:
if( vara == 1)
para

pawn Code:
if( !(vara^1))







Igualdade com AND
pawn Code:
if( vara == 1 && varb == 2)
com operadores:

pawn Code:
if( !(vara ^ 1) & !(varb ^ 2) )





Igualdade com OR
pawn Code:
if( vara == 1 || varb == 2)
com operadores:

pawn Code:
if( !(vara ^ 1) | !(varb ^ 2) )





Verificar se um й MAIS e outro MENOS

Como verificar se os valores tem sinais opostos?

Bem, vocк normalmente faria:

pawn Code:
new var1 = - 10;
new var2 = + 10;

if( var1 > 0 && var2 < 0 || var1 < 0 && var2 > 0)
Mas isto й ruim, muitas comparaзхes, operaзхes. Simplesmente faзa:

pawn Code:
if( var1 ^ var2 < 0)






Diferenзa

Й possнvel checar a diferenзa de dois valores sem usar !=

pawn Code:
if( var1 != var2)
use:

pawn Code:
if(var1 ^ var2)





Diferente de -1

Para checar se um nъmero й diferente de menos um normalmente fizemos:

pawn Code:
if(-1 != var)
pois com bitwise, podemos fazer:

pawn Code:
if(~var)
boa, nй?






Igual a um valor, ou igual a outro acrescido

Para checar se um valor й igual a outro valor ou este valor й igual a outro valor acrescido de mais um valor, normalmente fizemos:

pawn Code:
if(var1 == var2 || var1 == var2 + 30)
basta fazer

pawn Code:
if( !((30 ^ (var1 ^ var2)) & (var1 ^ var2)) )
Hard, nй?






Elevar o 2 na potкncia

Para elevar 2 a x potкncia normalmente usamos

pawn Code:
printf("%f", floatpower(2, 10)); // 2 elevado a 10
com outros operadores, podemos fazer:

pawn Code:
printf("%d", 1 << 10);
mais rбpido, mais fбcil, mais bonito.






Multiplicaзгo

Para multiplicar um valor por 4, basta fazer:

pawn Code:
printf("%d", 5 << 2); // 5 * 4 = 20
printf("%d", 6 << 2); // 6 * 4 = 24

e assim vai, dб pra multiplicar por * 4,8,16,32 .. bastando usar a sequкncia << 2,3,4,5 ..






Divisгo

Assim como na divisгo, basta usar o inverso >>

pawn Code:
printf("%d", 6 >> 1); // 6 / 2
E assim vai indo, sempre vai dividir na base 12, portanto nъmeros impares nгo serгo divididos






Pares

Muita gente conhece o operador %, mas hб outro modo de pegar nъmeros pares ou impares

Normalmente, uma pessoa faria:

pawn Code:
if(16 % 2 == 0)
para checar se um nъmero й par. Mas hб outro modo melhor:


pawn Code:
if(!(16 & 1))





Impares

Normalmente, uma pessoa faria:

pawn Code:
if(17 % 2 != 0)
para checar se um nъmero й impar. Mas hб outro modo melhor:


pawn Code:
if((16 & 1))
simples, nгo?






Valores nulos


Hб vбrios mйtodos para comparar valores nulos, o mais comum й o pessoal fazer:

pawn Code:
if(var1 == 0 && var2 == 0 && var3 == 0)
que tal poupar tempo, velocidade e acrescentar um pouquinho de beleza ao seu cуdigo fazendo:

pawn Code:
if(var1 | var2 | var3 == 0)





Trocar sinal

Hб vбrios modos, um deles й este:

PHP Code:
printf("%d", (~var + 1) ); 
ou

PHP Code:
printf("%d", (var ^ -1) + ); 



Troca de valores

Uma pessoa normal faria:

pawn Code:
new a = 1;
new b = 2;

new t = b;

b = a;
a = t;
com XOR, eu faria:

pawn Code:
a ^= b;
b ^= a;
a ^= b;





Pegar ъltimo nъmero

Essa dica nгo deve ser ъtil, mas й interessante

Vocк sabe como pegar o dнgito nъmero de um nъmero?

1648988484? Basta usar % 8

Logo:

pawn Code:
printf("%d", 1648988484 % 8);
vai retornar: 4


pawn Code:
printf("%d", 16489884818 % 8);
vai retornar: 8






Toogle valores

Jб viram aquele: Caso estiver UM, mudar para ZERO. Caso Estiver ZERO. Mudar para UM.

Como vocк faria? Provбvelmente

pawn Code:
if(var == 1) var = 0;
else var = 1;
ou talvez vocк seja inteligente e usa operadores ternбrios?

pawn Code:
var = var == 1 ? 0 : 1;
?

Nada disto, apenas use:

pawn Code:
var = !var;
simples, nй?






Tуpico original: http://ipsbr.net/portal/index.php/board,23.0.html


... inacabado. Em breve novas dicas avanзadas.

Reply
#2

Putz amanha eu termino de ler,puta sono...

Muito bom! Agora posso deixar meu cуdigo com aparкncia de foda e com funcionalidade simples
Reply
#3

Os mais complicados de entender foram estes:
pawn Code:
if( !((30 ^ (var1 ^ var2)) & (var1 ^ var2)) )
&
pawn Code:
printf("%d", 5 << 2); // 5 * 4 = 20
printf("%d", 6 << 2); // 6 * 4 = 24
O resto deu para entender.

Parabйns pelo tutorial Bruno.
Reply
#4

O operador << basicamente multiplica * 2

Logo


1 << 1 = 2
2 << 1 = 2


se eu fizer

<< 2 vai multplicar * 2 * 2 ou seja, 4

1 << 2 = 4 (1 * 2 * 2)
2 << 2 = 8 (2 * 2 * 2)
3 << 2 = 12 (3 * 2 * 2)
Reply
#5

Nossa, que simples. AEUAHEUAEHAUE ( Muito simples mesmo! ).

Agora eu entendi. Enfim, parabйns.

Reputado.
Reply
#6

Pode-se resumir da seguinte forma:


pawn Code:
a << b = a vezes 2 elevado a b.
a >> b = a dividido por 2 elevado a b.
Certo?
Reply
#7

Certo:

Code:
a << b = a vezes (2 elevado a b).
a >> b = a dividido por (2 elevado a b).
Reply
#8

Sim. Esqueci de ressaltar as prioridades.
Reply
#9

Me corrija nesta dъvida caso eu esteja errado Bruno, mas vocк disse que o operador "<<" basicamente multiplica por 2, e entгo vocк citou um exemplo:

Quote:

2 << 1 = 2

Mas 2 x 2 nгo й 4? Ou ele vai multiplicar o 1 duas vezes?
Reply
#10

Quote:
Originally Posted by n0minal
View Post
Me corrija nesta dъvida caso eu esteja errado Bruno, mas vocк disse que o operador "<<" basicamente multiplica por 2, e entгo vocк citou um exemplo:



Mas 2 x 2 nгo й 4? Ou ele vai multiplicar o 1 duas vezes?
pawn Code:
a << b // a vezes (2 elevado a b)
Foi explicado logo acima
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)