动态左移或右移

我有一个非常简单的问题。 有没有办法动态地向左或向右移位,例如取决于int的符号。

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

在这种情况下,我想将number1 3位向左移位,number2 2位向右移位。 有没有办法没有if else

?:算作if-else

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

对于32位:

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; } 

您可以在ideone上“查看正在运行的代码”: http ://ideone.com/F2vAB http://ideone.com/x1RbQ

不,你需要一个有条件的。

如果在右侧使用负值,则按位移位运算符具有未定义的行为。

如果要移位的位数的值为负,则结果是不确定的。 但是,您可以试验您的编译器,可能是您的编译器将向相反方向移动。 当然你可以使用?: ,但这只是表达if-else的另一种方式。