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

Sign in to follow this  
ZNez

Operações com BITS

Recommended Posts

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:

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.