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