Ir para o conteúdo
ZNez

Operações com BITS

Mensagens Recomendadas

ZNez

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

0x16 em binário é "00010110".

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


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ZNez

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

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.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

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


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ZNez

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 ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mogers

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.


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.