Pregunta

Actualmente tenemos algo de código para los dígitos extracto de un int, pero tengo que convertir esto en una plataforma sin snprintf, y tengo miedo de un desbordamiento del búfer. He comenzado a escribir mi propia snprintf portátil (y optimizado), pero me dijeron que pedir aquí en caso de que alguien tuvo una idea mejor.

int extract_op(int instruction)
{ 
    char buffer[OP_LEN+1];
    snprintf(buffer, sizeof(buffer), "%0*u", OP_LEN, instruction);
    return (buffer[1] - 48) * 10 + buffer[0] - 48;
}

Estamos utilizando cadenas de C, porque la velocidad es muy importante.

¿Fue útil?

Solución

El uso de sprintf debe estar bien. sizeof type * 3 * CHAR_BIT / 8 + 2 es un tampón suficientemente grande para la impresión de un número entero de tipo type. Se puede simplificar esta expresión si se asume CHAR_BIT es 8 o si sólo se preocupan por los formatos sin firmar. La idea básica detrás de esto es que cada uno contribuye bytes como máximo 3 dígitos en decimal (u octal), y se necesita espacio para una terminación signo y nula.

Otros consejos

no es necesario instruction forma en una matriz de caracteres para este propósito; sólo tiene que mantener a los dos dígitos "top", de la siguiente manera:

int extract_op(unsigned int instruction)
{
    int first = 0;
    int second = 0;
    while(instruction) {
        second = first;
        first = instruction % 10;
        instruction /= 10;
    }
    return first + 10 * second;
}

Creo que la expresión en el return está mal, pero sí imitan lo que está haciendo:. Diez veces el segundo dígitos, más el primero

Sospecho que la velocidad podría ser incluso mejor que lo que está recibiendo ahora, pero eso es hasta usted para medir en su plataforma específica y el compilador, por supuesto.

Hasta el momento no hay una respuesta que intercambia los últimos dos dígitos y una que permutas los dos primeros ... parece a mí como "%0*u", OP_LEN es forzar la salida de una anchura determinada, y el significado de las cifras extraídas está predeterminado por OP_LEN.

Suponiendo OP_LEN es una macro, podemos obtener 10 ^ (OP_LEN-2) con

#define DIVISOR ( (int) ( 1.e ## OP_LEN * 0.01 ) )

A continuación, similar a la respuesta de @ zneak,

int extract_op( int instruction )
{
    instruction /= DIVISOR;
    int tens = (instruction / 10) % 10;
    int units = instruction % 10;
    return units * 10 + tens;
}

#undef DIVISOR

U puede almacenar el dígito u están entrando en la matriz. Éste fue el CÓDIGO explica por ALEX. Aquí estoy añadiendo algunas variables.

int a[5];

int extract_op(unsigned int instruction)
{
int i=0;    
int first = 0;
    int second = 0;
    while(instruction) {
        second = first;
        first = instruction % 10;
        instruction /= 10;
    }
    a[i]=first;
}

Esto es algo que va a trabajar para todos los enteros tendrán un máximo de 5 dígitos. Pero aún si quieres tomar matriz dinámica entonces u puede utilizar la lista de enlace

debería funcionar también para 0 y <0.

int extract_op( int instruction )
{
  int numd = 1;
  while( instruction /= 10 )
    ++numd;
  return numd;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top