Manipulação de bits [RESOLVIDO]

1. Manipulação de bits [RESOLVIDO]

Beatriz da Silveira
beatrizs

(usa Outra)

Enviado em 14/08/2012 - 16:32h

Gostaria de saber como se faz para manipular bits, ou seja quero que uma variável do tipo int caiba num char.

Gostaria de uma explicação para saber utilizar as funções abaixo, para manipular os bits.

char BufferTX[10]={0};
char BufferRX[10]={0};
int iComando=0;

read((char *) BufferRX);
iComando=BufferRX[0] << 8;
iComando+=BufferRX[0] & 0x00FF;

BufferTX[0]= iComando >> 8;
BufferTX[1]= iComando & 0x00FF;
send ((char *) BufferTX);


  


2. MELHOR RESPOSTA

cr0n
_di0

(usa FreeBSD)

Enviado em 16/08/2012 - 00:43h

char BufferTX[10]={0};
char BufferRX[10]={0};

Finalizando um vetor de caractere com valor null --> 'f'o'o'b'a'r'a'l'b'{TTEXTO}
isso é necessário pois é de responsabilidade do programador passar para read onde termina o buffer lido:

read((char *) BufferRX);

iComando=BufferRX[0] << 8;

No primeiro índice há um deslocamento(shift) de 8 bits, portanto se temos nesse índice:

0000 0010 0000 0000 (512 em decimal)

após o deslocamento:

0000 0000 0000 0010 (ficará 2 em decimal)


iComando+=BufferRX[0] & 0x00FF;

Aqui uma comparação E bit a bit (acredito que saiba a tabela verdade)

Ou seja,

0000 0010 0000 0000 (512)
0000 0000 1111 1111(0x00FF)

O resultado da operação será:

0000000000000000 (tudo zerado)

O seguintes fragmentos fazem a mesma coisa, só que ao contrário

BufferTX[0]= iComando >> 8;
BufferTX[1]= iComando & 0x00FF;
send ((char *) BufferTX

Esse tipo de operação, é muito usado em Network Byte Orders(http://www.bruceblinn.com/linuxinfo/ByteOrder.html), aqueles métodos usados com tarefas designadas a sockets de comunicação, tais funções como:

htons() Host to Network Short
htonl() Host to Network Long

etc...

Há um motivo para tudo isso, o que é muito complexo para eu explicar aqui e também foge do foco da pergunta, pesquise sobre bitwise, operação bit a bit, big endian, caso tenha interesse.

3. Re: Manipulação de bits [RESOLVIDO]

Beatriz da Silveira
beatrizs

(usa Outra)

Enviado em 16/08/2012 - 18:00h

_di0 escreveu:

char BufferTX[10]={0};
char BufferRX[10]={0};

Finalizando um vetor de caractere com valor null --> 'f'o'o'b'a'r'a'l'b'{TEXTO}
isso é necessário pois é de responsabilidade do programador passar para read onde termina o buffer lido:

read((char *) BufferRX);

iComando=BufferRX[0] << 8;

No primeiro índice há um deslocamento(shift) de 8 bits, portanto se temos nesse índice:

0000 0010 0000 0000 (512 em decimal)

após o deslocamento:

0000 0000 0000 0010 (ficará 2 em decimal)


iComando+=BufferRX[0] & 0x00FF;

Aqui uma comparação E bit a bit (acredito que saiba a tabela verdade)

Ou seja,

0000 0010 0000 0000 (512)
0000 0000 1111 1111(0x00FF)

O resultado da operação será:

0000000000000000 (tudo zerado)

O seguintes fragmentos fazem a mesma coisa, só que ao contrário

BufferTX[0]= iComando >> 8;
BufferTX[1]= iComando & 0x00FF;
send ((char *) BufferTX

Esse tipo de operação, é muito usado em Network Byte Orders(http://www.bruceblinn.com/linuxinfo/ByteOrder.html), aqueles métodos usados com tarefas designadas a sockets de comunicação, tais funções como:

htons() Host to Network Short
htonl() Host to Network Long

etc...

Há um motivo para tudo isso, o que é muito complexo para eu explicar aqui e também foge do foco da pergunta, pesquise sobre bitwise, operação bit a bit, big endian, caso tenha interesse.





BufferTX[0]= iComando >> 8;
BufferTX[1]= iComando & 0x00FF;
send ((char *) BufferTX);

Tem alguma vantagem ao enviar isso por socket?







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts