¿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.
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 enterox
, 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:Explicación:
(x >> 31) & 1
extrae el bit de signo dex
y lo almacena en la variablesign
.!!x
es un truco para convertirx
a 0 o 1 según si es distinto de cero o no.!(sign ^ !!x)
devuelve 1 six
es positivo o cero y 0 six
es negativo.!(sign ^ !!x) - sign
resta el signo dex
del resultado anterior para obtener -1 six
es negativo, 0 six
es cero y 1 six
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 (>>
) parax
en lugar del operador de desplazamiento lógico hacia la derecha (>>>
).