Cambiar dinámicamente a la izquierda o a la derecha

Tengo una pregunta bastante simple. ¿Hay alguna forma de desplazarse dinámicamente a nivel de bits hacia la izquierda o hacia la derecha, por ejemplo, dependiendo del signo de un int.

signed int n = 3; signed int m = -2; int number1 = 8; int number2 = 8; //number1 shift n; //number2 shift m; 

En este caso, quiero desplazar el número1 3 bits a la izquierda y el número2 2 bits a la derecha. ¿Hay una manera sin if else ?

¿Tiene ?: Cuenta como un if-else ?

 int x = (n > 0) ? (number1 << n) : (number1 >> (-n)); int y = (m > 0) ? (number2 << n) : (number2 >> (-m)); 

Para 32 bits:

x = (((long long) x) << 32) >> (32 – n)

 #include  typedef unsigned (*fx_t)(unsigned, int); unsigned shiftleft(unsigned val, int bits) { return val << bits; } unsigned shiftright(unsigned val, int bits) { return val >> (-bits); } unsigned shift(unsigned val, int bits) { static fx_t sshift[2] = {shiftright, shiftleft}; return sshift[bits >= 0](val, bits); } int main(void) { signed int n = 3; signed int m = -2; unsigned number1 = 8; unsigned number2 = 8; printf("%u\n", shift(number1, n)); printf("%u\n", shift(number2, m)); return 0; } 

Puede “ver el código en ejecución” en ideone: http://ideone.com/F2vAB http://ideone.com/x1RbQ

No, necesitarás un condicional.

Los operadores de cambio a nivel de bits tienen un comportamiento indefinido si utiliza un valor negativo a su derecha.

Si el valor del número de bits a desplazar es negativo, el resultado no está definido. Sin embargo, puede experimentar con su comstackdor, podría ser que su comstackdor se desplace en la dirección opuesta. Y, por supuesto, podrías usar ?: , Pero esa es solo otra forma de express si-else.