int binToDec(string bin){
int ret = 0;
int i = 0;
while(bin[i] == '0' || bin[i] == '1'){
if(bin[i] == '0'){
ret <<= 1;
}else{
ret ^= 1;
ret <<= 1;
}
i++;
}
ret >>= 1;
return ret;
}
Alguém consegue me descrever linha a linha o que ocorre dentro do while ali ?!
Simplesmente não consigo entender (eu entendo que ali estão utilizando bitshift, mas o que acontece nesse bitshift ?).
while(bin[i] == '0' || bin[i] == '1'){
if(bin[i] == '0'){
ret <<= 1; // move em uma posição o bit para a esquerda(ex: 00000001 -> 00000010)
}else{
ret ^= 1; // realiza um ou exclusivo com 1(ou seja verdadeiro)
ret <<= 1;
}
i++; // incrementa i em 1 ^_^
}
Eu conheco o sistema de numeração (incluindo qualquer base numerica), mas o que eu não consigo compreender é como utilizar esses operadores de bit pra resolução de algum problema, simplesmente não entra na minha cabeça.
Eu ja li varios posts explicando mas nada me faz entender como utiliza-los…
Logica &:
10011
11101
10001
Logica |:
10011
11101
11111
Mas aqueles especiais: ^, >>, << não os entendo…
Será que alguem ai não tem alguma explicação que me faça entender isso, estou realmente necessitando de entender isso.
OBRIGADO !
J
juliocbq
Vinicius Zibetti Resko:
Só digo: lOl…
Eu conheco o sistema de numeração (incluindo qualquer base numerica), mas o que eu não consigo compreender é como utilizar esses operadores de bit pra resolução de algum problema, simplesmente não entra na minha cabeça.
Eu ja li varios posts explicando mas nada me faz entender como utiliza-los…
Logica &:
10011
11101
10001
Logica |:
10011
11101
11111
Mas aqueles especiais: ^, >>, << não os entendo…
Será que alguem ai não tem alguma explicação que me faça entender isso, estou realmente necessitando de entender isso.
OBRIGADO !
Vinícius, isso é uma máscara de bit. Normalmente quem não está no meio da eletrônica não utiliza constantemente. No meu caso eu necessito usar essas máscaras para:
Retirar informações de pacotes enviados por wireless(rádio ou ethernet)
imagine o seguinte pacote de 8 bits enviado por rádio de um controle remoto:
serie do controle número do botão
0010 0001
a informação enviada é 00100001 na variável x
para recuperar o número de série do controle e o botão pressionado no receptor eu faria:
int serie = x & 11110000 int bot = x & 00001111
Esse é um dos usos das máscaras. Existem vários.
Para melhor entendimento leia o artigo:
gomesrod
Olá,
Os números e operadores binários são bem fáceis de entender, mas difíceis de dominar a ponto de efetivamente utiliza-los para resolver problemas.
Eu por exemplo sou capaz de explicar passo-a-passo o que faz esse programa, mas não consigo fazer idéia de seu princípio ou que raciocínio levou à sua criação.
Mas o fato é que funciona! Fiz vários testes aqui e ele converte corretamente uma string binária para o número decimal correspondente.
Vamos ver um caso passo-a-passo:
Aplicando como entrada a string “0101” , correspondente ao numero 5 em decimal.
Como eu disse, a mecânica da coisa é fácil, mas entender as propriedades dos binários a ponto de criar e compreender tal solução não é tarefa para qualquer um.
D
denisGermano
legal, não conhecia isso tambem
gomesrod
Quer ver mais um exemplo do que eu falei, sobre a diferença entre dominar os binários e só "conhecer as operações"?
Em um sistema de performance crítica, esse tipo de otimização faz toda a diferença.
É como diz aquela piadinha infame... existem 10 tipos de pessoas, as que conhecem binário e as que não :-)
G
GilsonNunes
gomesrod:
Quer ver mais um exemplo do que eu falei, sobre a diferença entre dominar os binários e só "conhecer as operações"?
Em um sistema de performance crítica, esse tipo de otimização faz toda a diferença.
É como diz aquela piadinha infame... existem 10 tipos de pessoas, as que conhecem binário e as que não :-)
isto não é suficiente, pois se for fazer o uuid.toString() não bate com a string original do GUID. Rachei de procurar e acabei encontrando um algoritmo que faz um shift maluco, devido ao padrão do bit converter no Java ser little-endian. Enfim, dado que tenho o uuid na mão, o algoritmo continua assim: