OPERADORES(DUVIDA) [RESOLVIDO]

1. OPERADORES(DUVIDA) [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 30/11/2011 - 15:42h

alguem poderia me explicar detalhadamente a função dos seguintes operadores:

">>"
"<<"
"&"

estava estudando decidi executar os seguintes comandos:


printf ("\n O valor de x: %d", x);
x = 4;
k = 4;

x<<=k; /*Retornou valor 64 */

printf ("\n O valor de x: %d", x);
x = 4;
k = 4;

x>>=k; /* Retornou valor 0 */

printf ("\n O valor de x: %d", x);
x = 4;
k = 4;

x&=k; /* Retornou valor 4 */

printf ("\n O valor de x: %d", x);



Fico no aguardo vlw (;




  


2. MELHOR RESPOSTA

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 30/11/2011 - 17:53h

Boa noite.

Cara, isso é 'shift'.

Você 'anda' com os bits tantas casas à direita (>>) ou esquerda(<<).

Por exemplo, leta 'A', é 65 em decimal, e 01000001 em Binário.

Se você fizer:


printf ( "%d", 65 << 1 );


http://codepad.org/koLX78pe

Vai imprimir 130, ou seja, pegou o 01000001 e fez virar 10000010.

Eu tenho um code aqui no VOL que uma função faz esse método.

http://www.vivaolinux.com.br/script/[C]-Rotacao-de-Bits


/* rotatebits( x, n, d )
*
* x - number to rotate
* n - n jumps
* d - direction ( LEFT, RIGHT )
*/
int rotatebits( int x, int n, int d )
{
register int i;
unsigned bit;

for( i = 0; i < n; i++ )
{
bit = ( d == LEFT ) ? LASTBIT : FIRSTBIT;

/* saves the bit that will be lost in the shift */
bit = x & bit;

/* shifts the number */
x = ( d == LEFT ) ? x << 1 : x >> 1;

/* reset the lost bit in the other end of the number */
x |= ( bit ? ((d == LEFT) ? FIRSTBIT : LASTBIT ) : 0x00 );
}

/* returns the new number rotated */
return x;
}


Qualquer dúvida, posta denovo!

Espero ter ajudado,
Enzo Ferber
[]'s

3. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 30/11/2011 - 17:58h

Só um anexo!

Shitf é o que o programa que eu postei faz. Ele 'rotaciona' os bits. Sem perder nenhum no processo.

Já os operadores << e >> perdem os bits. Por exemplo:

http://codepad.org/jEod3uE1


main(){

char a = 'A';

printf ("%d\n", a);

a <<= 2;
printf("%d\n", a);

a >>= 2;
printf("%d\n", a);

return 0;
}


A saida é:
65
4
1

Observe que antes de imprimir o que gera a saida '1', eu faço a operação inversa com o mesmo parâmetro(2), e mesmo assim, o número não volta a ser 65. ;)




4. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 30/11/2011 - 18:07h

Faltou o & né?!

É o operador bitwise AND.

Ele faz o seguiten:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 1
1 & 1 = 1

Tendo como exemplo o char(A), que equivale DEC(65) ou BIN(01000001), vamos fazer:

128 & A = 0

Por que?

Essa operação é:

128 = 10000000
065 = 01000001

Se você fizer os bit a bit neles, verá que todas as operações com cada bit resultaram em 0.

Esse operador serve para pegar os bits iguais em dois bytes ;)

Tem outro operador, o | (o nome dele é OR)

Ele é assim:

0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1


Sacou tudo?

http://codepad.org/MWKgGp6A


void makebin(int d){
char str[9];
register int i;
for ( i = 0; i < 8; i++) str[i] = (d & 0x80 >> i) ? '1' : '0';
str[8] = 0x0;
printf("%s", str);
}


Tenta fazer a de transformar uma string de bits em número usando o OR. Não vale olhar meus scripts!!! ;)

Qualquer coisa posta denovo,
Enzo Ferber
[]'s


5. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/11/2011 - 18:22h

Nossa, fazia é tempo que não ouvia falar desses operadores bit-a-bit, lembro que quando comecei aprender C vi isso e achei uma coisa bizarra, mas depois lendo algumas coisas na net peguei a manha.

É complicadinho mas no final é até divertido.


6. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 30/11/2011 - 18:42h

EnzoFerber escreveu:

Boa noite.

Cara, isso é 'shift'.

Você 'anda' com os bits tantas casas à direita (>>) ou esquerda(<<).

Por exemplo, leta 'A', é 65 em decimal, e 01000001 em Binário.

Se você fizer:


printf ( "%d", 65 << 1 );


http://codepad.org/koLX78pe

Vai imprimir 130, ou seja, pegou o 01000001 e fez virar 10000010.

Eu tenho um code aqui no VOL que uma função faz esse método.

http://www.vivaolinux.com.br/script/[C]-Rotacao-de-Bits


/* rotatebits( x, n, d )
*
* x - number to rotate
* n - n jumps
* d - direction ( LEFT, RIGHT )





*/
int rotatebits( int x, int n, int d )
{
register int i;
unsigned bit;

for( i = 0; i < n; i++ )
{
bit = ( d == LEFT ) ? LASTBIT : FIRSTBIT;

/* saves the bit that will be lost in the shift */
bit = x & bit;

/* shifts the number */
x = ( d == LEFT ) ? x << 1 : x >> 1;

/* reset the lost bit in the other end of the number */
x |= ( bit ? ((d == LEFT) ? FIRSTBIT : LASTBIT ) : 0x00 );
}

/* returns the new number rotated */
return x;
}


Qualquer dúvida, posta denovo!

Espero ter ajudado,
Enzo Ferber
[]'s





printf ( "%d", 65 << 1 );
Vai imprimir 130, ou seja, pegou o 01000001 e fez virar 10000010.

porque o 01000001(9 caracter) virou 10000010 (9 caracter)

não entendi pegou a quantidade de bits antiga "01000001" e deletou aquele "0" inicial e acrescentou um "0" no final se 1 em binário é 1 .. e tambem por que ele adicionou apenas "0" tem algo haver com o numero "1" que foi passado? ..

talvez eu esteja me preciptando estudando isso sem mesmo ter um bom dominio da linguagem.. começei a fazer faculdade de sistemas tou concluindo o primeiro periodo agora mais até agora só tive logica de programação (portugol) :s


valeu mais uma vez Enzo :]~


7. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 30/11/2011 - 18:44h

mais uma coisa,
poderia me dar exemplos sobre a utilizade desses operadores?
não tou conseguindo imaginar uma forma útil de usar eles em um código :'(


8. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 01/12/2011 - 08:10h

Cara, tem 8 anos que programo, e nunca usei esses operadores ( << e >>). Mas os outros, uso agente usa toda hora.

Por exemplo, rotinas de criptografia utilizam muito &, |, ^, ~ e !

AND, OR, XOR, PARITY e NOT.

Mas os 'deslocamentos à direita/esquerda' (esse é o nome do operador) podem ser usados para multiplicação e divisão de umas forma bem rápida.

1 deslocamento a esquerda divide o número por 2, e para a direita, multiplica por 2.

Deslocamento a direita: <<
Deslocamento a esquerda: >>

Já mostrei a rotina de transformar um número em binário usando o & (AND BITWISE), olha o código pra pegar uma string binária e transformar em número.


#include <stdio.h>

#define NUMBITS 8

int bindec( char *str)
{
register int i;
int dec = 0x0;

for ( i = 0; i < NUMBITS; i++ ) dec |= (str[i] == '1') ? 0x80 >> i : 0;

return dec;
}

int main ( void )
{
printf ( "%d\n", bindec("01000001"));
return 0;
}



Retorna 65. ;)

http://codepad.org/DGwPSb15

Os deslocamentos também podem ser úteis quando você está lendo entrada de hardware, ou coisas do tipo. Tem algumas utilidades, eu mesmo, num usei, só na função rotatebits()

Espero ter ajudado,
Enzo Ferber
[]'s



9. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/12/2011 - 09:43h

~lujjc4 escreveu:

mais uma coisa,
poderia me dar exemplos sobre a utilizade desses operadores?
não tou conseguindo imaginar uma forma útil de usar eles em um código :'(


Isso é para quem quer programar em baixo nível, são ótimos em quesito de velocidade. Dá, por exemplo, para mapear os bits de um int e ligar ou desligar esses bits específicos, o pessoal do arduino sabe bem disso hehe.




10. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 01/12/2011 - 12:56h

Valeu pela resposta brother :D


11. Re: OPERADORES(DUVIDA) [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 01/12/2011 - 12:58h



Valeuu grande Enzo
até a proxima dúvida (=









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts