动态左移或右移

时间:2011-11-04 12:15:12

标签: c

我有一个非常简单的问题。有没有办法动态地向左或向右或向右移动,例如取决于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

5 个答案:

答案 0 :(得分:4)

对于32位:

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

答案 1 :(得分:3)

#include <stdio.h>

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

?:是否算作if-else

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

答案 4 :(得分:0)

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