[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: escreva-bits



Pelo que e entendi essa coisa de bits funciona assim:

if ((++j)%8==0) i++, j=0;
w[i] |=(v[k]&01)<<(7-j);

O j conta qtos bits já foram escritos no caractere w[i], e qdo ++j chega a 8,
passamos para o proximo caractere a ser formado, incrementando o i de um. Veja
que esse novo caractere te todos os seus bits iguais a 0;

A linha "w[i] |=(v[k]&01)<<(7-j)", pode ser reescrita dessa forma:

ch = ch | ((v[k] & 01)<<(7 - j));

Fazendo v[k] & 01 nos obtemos apenas o ultimo bit de v[k].
por exemplo, se v[k] for 01001001, ao fazermos a opreracao teremos:
01001001 & 00000001, o que retornará 00000001, ou seja, o ultimo bit de v[k],
o que indica que ele é ímpar.

Agora precisamos escrever o bit 1 no primeiro bit de ch (assumindo que nenhum
bit havia sido escrito em ch até o momento). Para isso o que fazemos e dar um
shift para a esquerda de 7 menos j posicoes no caractere 00000001. Ainda
assumindo o exemplo dariamos um shift de (7 - 0) posicoes para a esquerda em
00000001, que ficaria igual a 10000000.
Agora, para escrever isso em ch, fazemos 00000000(valor atual de ch) |
100000000.
Essa operacao resultaria em 10000000, que e o novo valor de ch.

Num segundo passo, com v[k] = 10010111, o ultimo bit e igual a 1, que com um
shift de (7 - 1) posicoes para a esquerda fica igual a 010000000, e apos
fazermos 10000000 & 01000000 teremos o caractere 11000000, que e exatamente o
que queríamos, e assim por diante até formarmos os oito bits do caractere e
voltar ao início.

Espero ue de pra entender o que eu expliquei, mas isso é muito complicado
mesmo.





Alexandre Freire wrote:

> a meu ver o escreva bits só escreve a paridade da sequencia de inteiros em
> um arquivo (talvez nao seja isso mas nao consegui entender o
> programa....), alguem pode me explicar como funciona o escreva_bits, e
> também como posso adápta-lo ao meu ep4?
> valeu!
> @lex
>
>  Alexandre Freire      <alex@linux.ime.usp.br>