Tengo que convertir un número binario como por ejemplo unsigned int bin_number = 10101010
en su representación decimal (es decir, 170
) lo más rápido posible? ¿Cuál es el mejor algoritmo?Forma rápida de convertir un número binario a un número decimal
Respuesta
Usando plantillas, puede resolver este problema en tiempo de compilación.
template<unsigned long num>
struct binary
{
static unsigned const value =
binary<num/10>::value << 1 | num % 10;
};
// Specialization for zero
template<>
struct binary<0>
{ static unsigned const value = 0; };
La plantilla binario se crea una instancia de nuevo con una más pequeña num
, hasta num
llega a cero y la especialización se utiliza como una condición de terminación.
Ejemplo: std::cout << binary<10101010>::value;
Para tiempo de ejecución problema:
unsigned binary_to_decimal(unsigned num)
{
unsigned res = 0;
for(int i = 0; num > 0; ++i)
{
if((num % 10) == 1)
res += (1 << i);
num /= 10;
}
return res;
}
¿Puedes hacerme un ejemplo? – Nick
Usando plantillas puedes calcular cualquier cosa en tiempo de compilación, ya que están completas. ¿Sin embargo ayuda eso al OP a hacer algo? – PlasmaHH
-1: lo dudo. Si OP tuviera un ICE, que necesitaría para usar la metaprogramación, podría hacer 'const double d = 170.0;' Como está seguro que obtiene el número de entrada en tiempo de ejecución, entonces la metaprogramación está desactivada. –
En realidad, si usted escribe unsigned int bin_number = 10101010
, esto se interpreta como un número decimal por el compilador.
Si desea escribir un Litteral binario en el código fuente, se debe utilizar BOOST_BINARY.Then sólo tiene que imprimir usando cout
, decimal es el valor por defecto ...
unsigned int i = BOOST_BINARY(10101010);
std::cout << i; // This prints 170
Bueno, si esto "número" es en realidad una cadena obtenida de alguna fuente (leída de un archivo o de un usuario) que usted convirtió en un número (creyendo que es más apropiado para un número real), lo cual es bastante probable, puede usar un std::bitset
para hacer la conversión:
#include <bitset>
unsigned int number = std::bitset<32>("10101010").to_ulong();
(Por supuesto, la 32
aquí se define la aplicación y pueden escribirse más apropiadamente como std::numeric_limits<unsigned int>::digits
.)
Pero si es realmente un número (variable entera) en el (muy) el primer lugar que podría hacer:
#include <string>
unsigned int number = std::bitset<32>(std::to_string(bin_number)).to_ulong();
(usando C++ 11 to_string
) Pero esta probablemente ya no sea la forma más eficiente, ya que otros han presentado algoritmos más eficientes basados en números. Pero como dije, dudo que realmente consigas este número como una variable entera real desde el primer lugar, sino que lo lees desde algún archivo de texto o desde el usuario.
Gracias, esta es una buena respuesta, pero el número no es una cadena, no puedo usar C++ 11 y pedí una solución rápida. – Nick
@Nick Así que puedo preguntar de dónde lo sacaste, obviamente tienes que obtenerlo de alguna parte y dudo que realmente leas un número binario, que representa un número que solo contiene 0 y 1, eso sería una basura.Realmente tiene sentido obtener ese número de algún medio textual en primer lugar. La única excepción es cuando necesitas constantes binarias, pero para esto puedes usar otro método (el programa de plantillas de gliderkite es muy bueno). Pero para la mayoría de los casos, cuando se trata de una cadena, la solución de conjunto de bits no debe ser la más lenta (y tampoco necesita C++ 11). –
por cierto tienes mi +1 – Nick
Si conoce el número de dígitos binarios que usted está tratando con y que siempre ha fijado y el número binario viene en una cadena (como lo sería si se lee desde un archivo o entrada estándar) en tiempo de ejecución (es decir, la conversión de tiempo de compilación no es posible) entonces usted podría adoptar este enfoque:
int to_binary(const char* c)
{
return ((c[0] & 1) ? 0x80 : 0x00) |
((c[1] & 1) ? 0x40 : 0x00) |
((c[2] & 1) ? 0x20 : 0x00) |
((c[3] & 1) ? 0x10 : 0x00) |
((c[4] & 1) ? 0x08 : 0x00) |
((c[5] & 1) ? 0x04 : 0x00) |
((c[6] & 1) ? 0x02 : 0x00) |
((c[7] & 1) ? 0x01 : 0x00);
}
Esto supone un número binario fijo de ocho dígitos.llamada así:
std::cout << to_binary("10101010") << std::endl;
Si tuviera un número de dieciséis bits todavía se podía usarlo:
const char* bin_number = "1010101010101010";
// Deal with 16 bits
std::cout << (to_binary(bin_number) << 8 | to_binary(bin_number + 8)) << std::endl;
Tenga en cuenta que claramente no hay comprobación de los límites aquí y estoy confiando en el hecho de que la LSB de '1' siempre es 1 y '0' es siempre 0 (por lo que no valida que en realidad sea una entrada binaria).
Naturalmente, es bastante específico y no muy flexible, pero cumple su función y yo soy no estoy seguro de que obtendrías mucho más rápido.
- 1. Convertir decimal a binario Vector
- 2. Forma rápida de modificar manualmente un número
- 3. Convertir cadena a número decimal en ruby
- 4. ¿Cómo puedo convertir un número decimal a hexadecimal en VIM?
- 5. Convertir decimal a binario en python
- 6. Ruby: contar el número de 1 de un número binario
- 7. Cómo convertir un número entero en un vector binario?
- 8. ¿Cómo limitar un número decimal?
- 9. ¿Existe alguna forma más rápida de convertir un número en un nombre?
- 10. ¿La forma más rápida de convertir cadenas a binario?
- 11. Número entero o número decimal
- 12. Forma rápida de encontrar el siguiente múltiplo de un número
- 13. ¿Cómo convertir un número a un byte?
- 14. Conversión de un número hexadecimal a binario en ruby
- 15. Javascript invirtiendo un valor binario de un número
- 16. ¿Alguna manera de convertir un Período JodaTime a un número decimal de horas?
- 17. Cómo convertir una cadena numérica a número (decimal) y número a cadena
- 18. ¿Cómo convertir el número de flotador a Binario?
- 19. Convertir en base 2 cuerdas número binario a int
- 20. ¿Cómo convertir palabras a un número?
- 21. ¿Cómo convertir un número negativo a positivo?
- 22. Agregue separadores de millares 'decimal-mark' a un número
- 23. Convertir el número exponencial presentado como una cadena a un decimal
- 24. Representación del número binario
- 25. C# convertir un decimal a un int con seguridad
- 26. ¿Cómo puedo convertir un número a un INTERVAL de minutos?
- 27. ¿Cómo convertir una representación de cadena de un número a un número en coldfusion?
- 28. Convertir un número a 2 decimales en Java
- 29. ¿Cómo hacer un Integer.parseInt() para un número decimal?
- 30. Forma correcta de convertir el número * de char a int32_t
¿El '10101010' proviene del usuario de su programa, o es simplemente un código literal? –
¿Puede dar una mejor idea de dónde se origina el número binario? ¿Se conoce en tiempo de compilación o solo en tiempo de ejecución? ¿Está almacenado en una cuerda o en alguna otra estructura? Sabiendo esto hará que responder la pregunta sea mucho más fácil. –
Sí, lo siento. Normalmente obtengo el número de tiempo de ejecución, pero a veces en tiempo de compilación. Todavía estoy aprendiendo. – Nick