Veo que esta pregunta ya se ha hecho, sin embargo, las respuestas fueron un poco vagas e inútiles. De acuerdo, necesito implementar una expresión c usando solo "&^~! + | >> < <"Declaración condicional usando operadores Bitwise
La expresión debe parecerse a: a? b: c
Así, a partir de lo que he sido capaz de decir, la expresión tiene que ser algo como:
return (a & b) | (~a & c)
Esto funciona cuando a = 0, porque anding con B asumirá cero, y luego la expresión o devolverá el lado derecho, (~a & c)
, que funciona porque ~ 0 da todos los unos, y al hacer que c con todos devuelva c.
Sin embargo, esto no funciona cuando a> 0. ¿Puede alguien tratar de explicar por qué ocurre esto, o cómo solucionarlo?
Esto es realmente perfecto. Entonces, ¿por qué agregar uno hace que todo esté definido o sea claro? Entiendo por qué eso tiene que suceder, pero no entiendo cómo sucede eso. – atb
Si comenzamos con 0, luego voltear los bits da todos los. Cuando agregamos uno, todos vuelven a ceros (y el acarreo se establece, pero lo ignoramos). Si comenzamos con 1, voltear los bits da 111 ... 10. Al agregar 1, el último 0 pasa a ser 1, por lo que todos los bits son ahora 1. –
la parte 'y = ~ x + 1' me confundió; Finalmente me di cuenta de que funciona debido al desbordamiento de enteros en caso de que x = 0, pero no es obvio. La solución más clara para mí fue primero cambiar lsb a msb con desplazamiento a la izquierda (00000001 => 10000000) y luego copiar msb con el desplazamiento a la derecha: 'y = (x << 31) >> 31' –