Jump to content

Operações com BITS


ZNez

Recommended Posts

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:

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

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!

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

"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.

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

"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.

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
×
×
  • Create New...

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.