es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se devuelve 1, 0 o -1 basado en un entero dado que es positivo, cero o negativo utilizando solo operaciones bitwise en C y sin el signo “-“?

Estoy trabajando en una función, llamada sign, que devuelve 1 si un entero dado es positivo, 0 si es cero y -1 si es negativo. Solo se me permite utilizar las siguientes operaciones: ! ~ & ^ | + << >>. Hasta ahora, he intentado varias cosas y he llegado muy cerca, pero no sé cómo distinguir entre un 1 y un -1.


int sign(int x) {
return (((x >> 31) & 1) ^ (!x));
}

¿Me falta algo aquí? Me estoy volviendo loco tratando de resolver esto.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es necesario agregar una verificación adicional para distinguir entre un número positivo y un número negativo. La expresión (x >> 31) devuelve el bit de signo del entero x, que es 0 para números positivos o cero y 1 para números negativos. Por lo tanto, se puede usar esta expresión para devolver el signo correcto del número cuando no es cero:

    int sign(int x) {
        int sign = (x >> 31) & 1; // 0 para positivos o cero, 1 para negativos
        return !(sign ^ !!x) - sign; // 1 para positivos, 0 para cero, -1 para negativos
    }
    

    Explicación:

    • (x >> 31) & 1 extrae el bit de signo de x y lo almacena en la variable sign.
    • !!x es un truco para convertir x a 0 o 1 según si es distinto de cero o no.
    • !(sign ^ !!x) devuelve 1 si x es positivo o cero y 0 si x es negativo.
    • La expresión !(sign ^ !!x) - sign resta el signo de x del resultado anterior para obtener -1 si x es negativo, 0 si x es cero y 1 si x es positivo.

    Tenga en cuenta que la expresión !(x >> 31) también se puede usar en lugar de (x >> 31) & 1 para obtener el mismo resultado, siempre y cuando se use el operador de desplazamiento aritmético hacia la derecha (>>) para x en lugar del operador de desplazamiento lógico hacia la derecha (>>>).

Comments are closed.