• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ZNez

Operações com BITS

7 mensagens neste tópico

Boas...

Estava a fazer operações com bits em C, quando me deparo com um problema.

Queria converter um long long (64 bits) para string, em que esta fosse constituída pelos números em base 2.

Lembrei-me de começar pelos bits mais significativos e através de mascaras num ciclo for ir passando para string, contudo estou a obter o número em decimal.

Para efeitos de teste atribuí um valor mais pequena à minha variável key.

	int i, array[8];
int var = 20;

for (i=0; i<8; i++){
	array[i] = var & 0x16;
	printf("%d %d\n", var, array[i]);
	var >>= 1;
}

Desde já obrigado :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

0x16 em binário é "00010110".

Tens a certeza que queres fazer o & com esse valor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estou a ver que então o meu raciocinio está errado :S.

Deveria ser 80? Ou algo assim parecido?

A ideia não é a máscara do bit mais significativo a 1, e dps por aí adiante?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tu queres isolar os bits, por isso tens que fazer o & com um valor só com um bit.

Se queres começar pelo bit mais significativo do valor, é 0x80 para 8 bits (ou seja 1 << 7), o que dá 0 ou 128. Se der 128 tens que passar esse 128 a 1 :thumbsup:

Mas acho que é mais fácil se começares pelo bit menos significativo.

Ah! Olha que o teu "int var" devia ser "unsigned int var". As operações binárias "não gostam" de números negativos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez de pensares em hexadecimal, penso que é mais simples começares por usar os shifts. Visto que tás a converter um long long, tens 64 bits, por isso:

for ( bit = 63 ; bit >= 0 ; bit-- )
     array[ 63 - bit ] = ( var & (1LL << bit) ) ? '1' : '0' ; // 1LL para que o shift seja feito num long long

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmmm... tava a testar esse código mas isso não me ta a dar o resultado esperado, aliás não está a escrever nenhum 0 nem 1.

o 1LL que usas é para ir directamente para o bit mais significativo ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu pus um comentário ali: "1LL para que o shift seja feito num long long". Ao fazeres 1 << bit o resultado é calculado num int e dá overflow se o shift for superior a 31. O 1LL é apenas para tomar a constante "1" como um long long.

Eu não testei o código, escrevi-o de cabeça, era só para teres uma ideia do que tava a sugerir, mas penso que devia funcionar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora