ZNez 0 Posted December 31, 2008 Report Share Posted December 31, 2008 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 Link to post Share on other sites
pmg 85 Posted December 31, 2008 Report Share Posted December 31, 2008 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! Link to post Share on other sites
ZNez 0 Posted December 31, 2008 Author Report Share Posted December 31, 2008 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? Link to post Share on other sites
pmg 85 Posted December 31, 2008 Report Share Posted December 31, 2008 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 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
mogers 13 Posted December 31, 2008 Report Share Posted December 31, 2008 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
ZNez 0 Posted December 31, 2008 Author Report Share Posted December 31, 2008 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 ? Link to post Share on other sites
mogers 13 Posted December 31, 2008 Report Share Posted December 31, 2008 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now