Condicional usando operadores de Bitwise

¿Cómo se representa el operador condicional utilizando operadores bitwise?

Edit: Perdón por la pobre explicación. Es una pregunta de tarea en la que tengo que implementar el operador condicional usando solo operaciones bitwise. Sería sencillo si las declaraciones fueran permitidas, sin embargo, deben ser estrictamente operadores de bit a bit. La función toma tres ints y funciona igual que el operador condicional normal. Este primer int se evalúa y uno de los dos últimos se devuelve según el valor del primero. Esperaba que hubiera un algoritmo simple para esto. Cualquier idea sobre dónde empezar sería de gran ayuda. ¡Gracias!

¿Se permiten los turnos como operadores bit a bit? ¿Se permiten los operadores aritméticos?

Su edición no está del todo clara, pero supongo que necesita implementar un equivalente de

 a ? b : c 

donde a , b y c son enteros. Esto es a su vez equivalente a

 a != 0 ? b : c 

Una forma de lograrlo es encontrar una manera de convertir el valor no cero de a en un patrón de bits de todos utilizando únicamente operadores bitwise. Si descubrimos cómo hacerlo, el rest sería fácil. Ahora, no recuerdo inmediatamente ningún truco ingenioso que hiciera eso (creo que existen), y no sé a ciencia cierta qué operadores están permitidos y cuáles no, así que por ahora solo usaré algo como

 a |= a >> 1; a |= a >> 2; a |= a >> 4; a |= a >> 8; a |= a >> 16; a |= a << 1; a |= a << 2; a |= a << 4; a |= a << 8; a |= a << 16; 

Para un tipo de entero de 32 bits, si (y solo si) hubo al menos un bit establecido en el original a , lo anterior debería dar como resultado que todos los bits de a conjunto sean 1. (Supongamos que estamos trabajando con enteros sin signo, para evitar los problemas asociados con el desplazamiento de los valores firmados). Una vez más, debe haber una forma más inteligente de hacerlo, estoy seguro. Por ejemplo: a = !a - 1 , pero no sé si ! y - están permitidos.

Una vez que hemos hecho eso, el operador condicional original se convierte en equivalente a

 (a & b) | (~a & c) 

Hecho.

No es, básicamente, El operador condicional solo evaluará uno de los segundos o terceros operandos; Los operadores bit a bit siempre evalúan ambos operandos.

No creo que realmente tenga sentido pensar en el operador condicional en términos de operadores bitwise para comenzar con … por ejemplo, si el segundo y tercer operandos son tipos de punteros, no querría pensar en esos en términos de operaciones en modo bit, ¿lo harías? Trate el operador condicional por separado de los operadores bitwise: no se hará ningún favor al tratar de amalgamarlos.

Creo que el OP está buscando una forma de express las cosas que normalmente requeriría un condicional de una manera sin sucursales. Por ejemplo (asumiendo que unsigned x,y,z; y x está delimitado por INT_MAX ):

 if (x>2) y+=z; 

se puede express como:

 y += z & -(2-x >> sizeof(unsigned)*CHAR_BIT-1); 

Este ejemplo me viene a la mente porque lo he usado en una “ordenación binaria sin sucursales” en varias ocasiones. Cuando el tamaño de la matriz que se está buscando es constante, esto permite desenrollar completamente el bucle de búsqueda en una secuencia de operaciones sin twigs, y comstackr solo unos pocos códigos de operación por paso. Aquellos que se oponen a escribir “ensamblador en C” pueden preferir que se escriba:

 y += (x>2) ? z : 0; 

y espero que el comstackdor genere una máscara de bits equivalente o cmov instrucción cmov . 🙂

En el nivel muy básico se convierte en electrónica. Ver esto No puedo pensar en ninguna otra aplicación para su pregunta.

Si se refiere al operador de selección ternario, esto puede representarse mediante operaciones a nivel de bits, pero solo en ciertos casos (de hecho, es una optimización para usar operaciones a nivel de bits en algunos casos). Por ejemplo: (getsomevalue() == 1) ? somepointer : NULL; (getsomevalue() == 1) ? somepointer : NULL; puede representarse como somepointer & ~((unsigned)(getsomevalue()) - 1); asumiendo que getsomevalue() solo devuelve 1 o 0 (también conocido como BOOL)