SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 09/10/2013, 01:51 AM   #1
ipsBruno
Godfather
 
ipsBruno's Avatar
 
Join Date: Apr 2010
Location: Brazil, Caxias RS
Posts: 6,084
Reputation: 546
Default Truques com operadores especiais (bits tips and tricks, hacks)

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.

__________________
https://github.com/ipsBruno

Last edited by ipsBruno; 12/10/2013 at 12:48 AM.
ipsBruno is offline   Reply With Quote
Old 09/10/2013, 01:56 AM   #2
Juniiro3
High-roller
 
Join Date: Feb 2013
Location: Campinas, Brasil
Posts: 1,800
Reputation: 140
Default Re: Truques com operadores especiais (bits operators)

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
Juniiro3 is offline   Reply With Quote
Old 09/10/2013, 01:59 AM   #3
Coe1
High-roller
 
Coe1's Avatar
 
Join Date: Jul 2013
Posts: 1,043
Reputation: 86
Default Re: Truques com operadores especiais (bits operators)

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.
Coe1 is offline   Reply With Quote
Old 09/10/2013, 02:03 AM   #4
ipsBruno
Godfather
 
ipsBruno's Avatar
 
Join Date: Apr 2010
Location: Brazil, Caxias RS
Posts: 6,084
Reputation: 546
Default Re: Truques com operadores especiais (bits operators)

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)
__________________
https://github.com/ipsBruno
ipsBruno is offline   Reply With Quote
Old 09/10/2013, 02:05 AM   #5
Coe1
High-roller
 
Coe1's Avatar
 
Join Date: Jul 2013
Posts: 1,043
Reputation: 86
Default Re: Truques com operadores especiais (bits operators)

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

Agora eu entendi. Enfim, parabéns.

Reputado.
Coe1 is offline   Reply With Quote
Old 09/10/2013, 02:17 AM   #6
zPain
Gangsta
 
zPain's Avatar
 
Join Date: Sep 2013
Location: Brazil
Posts: 665
Reputation: 183
Default Re: Truques com operadores especiais (bits operators)

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?
zPain is offline   Reply With Quote
Old 09/10/2013, 02:22 AM   #7
ipsBruno
Godfather
 
ipsBruno's Avatar
 
Join Date: Apr 2010
Location: Brazil, Caxias RS
Posts: 6,084
Reputation: 546
Default Re: Truques com operadores especiais (bits operators)

Certo:

Code:
a << b = a vezes (2 elevado a b).
a >> b = a dividido por (2 elevado a b).
__________________
https://github.com/ipsBruno
ipsBruno is offline   Reply With Quote
Old 09/10/2013, 02:24 AM   #8
zPain
Gangsta
 
zPain's Avatar
 
Join Date: Sep 2013
Location: Brazil
Posts: 665
Reputation: 183
Default Re: Truques com operadores especiais (bits operators)

Sim. Esqueci de ressaltar as prioridades.
zPain is offline   Reply With Quote
Old 09/10/2013, 03:49 PM   #9
n0minal
High-roller
 
n0minal's Avatar
 
Join Date: Mar 2013
Location: Rio de Janeiro
Posts: 4,046
Reputation: 789
Default Re: Truques com operadores especiais (bits operators)

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?
n0minal is offline   Reply With Quote
Old 09/10/2013, 03:51 PM   #10
zPain
Gangsta
 
zPain's Avatar
 
Join Date: Sep 2013
Location: Brazil
Posts: 665
Reputation: 183
Default Re: Truques com operadores especiais (bits operators)

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
zPain is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Tutorial] Dicas e Truques e Otimizações ipsBruno Lançamentos/Releases 30 03/10/2016 06:16 PM
[Tutorial] Truques com icmd7 ipsBruno Lançamentos/Releases 18 21/10/2013 06:51 PM
[Include] Bits Booleanos - O que são bits? ipsBruno Lançamentos/Releases 42 27/06/2012 09:58 AM


All times are GMT. The time now is 03:23 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.