Truques com operadores especiais (bits tips and tricks, hacks) -
ipsBruno - 09.10.2013
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:
mйtodo Bruno:
admin || item != 5
Mйtodo comum:
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) | !(a ^ b))
ou
PHP Code:
if(!(((a-((a-b)&(a-b)>>31))^a)) | !(a ^ b))
a <= b
PHP Code:
if( ((a-b) & 0x80000000) | !(a ^ b))
ou
PHP Code:
if(!!(((a-((a-b)&(a-b)>>31))^a)) | !(a ^ b))
checar negatividade
ou
PHP Code:
if( (a & 0x80000000) ) // fasthest
checar positividade
ou
PHP Code:
if( !(a & 0x80000000) ) //fasthest
a > 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))) & (a ^ 0))
PHP Code:
if( ((a-b) & 0x80000000) & (a ^ 0))// fastheat
get min value
pawn Code:
if( a >= b) {
maxs = b;
}
else
{
maxs = a;
}
ou
ou
pawn Code:
maxs = y ^ ((x ^ y) & -(!((y-x) & 0x80000000)));
get max value
pawn Code:
if( a >= b) {
maxs = a;
}
else
{
maxs = b;
}
ou
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))) & (a ^ 0))
ou
PHP Code:
if( ((b-a) & 0x80000000) & (a ^ 0))
a < b && a == 0
PHP Code:
if( (!(((a-((a-b)&(a-b)>>31))^a))) & !(a ^ 0))
ou
PHP Code:
if( ((a-b) & 0x80000000) & !(a ^ 0))
a > b && a == 0
PHP Code:
if( (!!(((a-((a-b)&(a-b)>>31))^a))) & !(a ^ 0))
a < b
poderia ser feito
PHP Code:
if(!!(((a-((a-b)&(a-b)>>31))^a)))
ou
Igualdade com XOR
para
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:
Diferenзa
Й possнvel checar a diferenзa de dois valores sem usar !=
use:
Diferente de -1
Para checar se um nъmero й diferente de menos um normalmente fizemos:
pois com bitwise, podemos fazer:
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:
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:
para checar se um nъmero й par. Mas hб outro modo melhor:
Impares
Normalmente, uma pessoa faria:
para checar se um nъmero й impar. Mas hб outro modo melhor:
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) + 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:
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?
164898848
4? 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?
?
Nada disto, apenas use:
simples, nй?
Tуpico original:
http://ipsbr.net/portal/index.php/board,23.0.html
... inacabado. Em breve novas dicas avanзadas.
Re: Truques com operadores especiais (bits operators) -
Juniiro3 - 09.10.2013
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
Re: Truques com operadores especiais (bits operators) -
Coe1 - 09.10.2013
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.
Re: Truques com operadores especiais (bits operators) -
ipsBruno - 09.10.2013
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)
Re: Truques com operadores especiais (bits operators) -
Coe1 - 09.10.2013
Nossa, que simples. AEUAHEUAEHAUE ( Muito simples mesmo! ).
Agora eu entendi. Enfim, parabйns.
Reputado.
Re: Truques com operadores especiais (bits operators) -
zPain - 09.10.2013
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?
Re: Truques com operadores especiais (bits operators) -
ipsBruno - 09.10.2013
Certo:
Code:
a << b = a vezes (2 elevado a b).
a >> b = a dividido por (2 elevado a b).
Re: Truques com operadores especiais (bits operators) -
zPain - 09.10.2013
Sim. Esqueci de ressaltar as prioridades.
Re: Truques com operadores especiais (bits operators) -
n0minal - 09.10.2013
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?
Re: Truques com operadores especiais (bits operators) -
zPain - 09.10.2013
Quote:
Originally Posted by n0minal
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