¿Conversión de cadena binaria a decimal?

En el siguiente código, estoy convirtiendo un binario a decimal y luego imprimiendo el carácter correspondiente.

void convertToChar(int binaryChar[],int length) { int multiplier = 0; int i; int sum = 0; for(i=length;i>=0;i++) { sum = sum + (binaryChar[i]*pow(2,multiplier)); multiplier = multiplier + 1; } printf("\nThe character is: %c",sum); } 

El problema está en la línea sum = sum + (binaryChar[i]*pow(2,multiplier)); .Lesta el error: warning: converting to int ‘desde el double' . double' favor, ayuda!

¿Por qué usas pow para calcular una potencia de 2? Es muy lento Utilice 1 << p para obtener la potencia p-th de dos. Por ejemplo, 1 << 0 dará 1, 1 << 1 dará 2, 1 << 2 dará 4. Esto se debe a la naturaleza de la operación de cambio de bit: desplazar un bit a la izquierda equivale a multiplicar por 2 .

Además, parece que tienes un ciclo sin fin en tu progtwig:

 for(i=length;i>=0;i++) 

Si la length es> = 0, el bucle nunca terminará.

Esto debería arreglarlo:

 for(i = length - 1; i>=0; i--) sum += (binaryChar[i]*(1 << multiplier++)); 

la firma de pow es:

 double pow(double X, double Y); 

Para calcular el uso del multiplicador de 2 ^:

 1 << multiplier; 

Sólo para mencionar rápidamente:

  • Tienes un bucle infinito
  • Si analiza la cadena desde la otra dirección, puede multiplicar la sum por dos para que no necesite la variable multiplier .
  • Después de tantos problemas, ni siquiera estoy seguro de que int binaryChar[] sea ​​correcto. Char en el nombre sugiere un tipo diferente (y código) ..

.

pow toma dobles y devuelve un doble. Una solución fea es solo usar un yeso

 (int)pow(x, y) 

Pero en este sencillo progtwig, ¿por qué no solo haces la expansión de potencia tú mismo en lugar de llamar a pow?

El problema es que la precisión del tipo de datos int es menor, ya que la precisión del doble (la función pow devuelve el doble), por lo que el valor de binaryChar [i] se convertirá implícitamente al doble y así sucesivamente … la línea problemática implícita parece esta:

 sum = (double) sum + ((double) binaryChar[i] * pow((double)2, (double) multiplier)) 

para deshacerse de la advertencia, debe realizar una conversión explícita (consulte Conversión de tipo ), por ejemplo:

 sum = sum + (binaryChar[i] * ((int) pow(2, multiplier));