一个CMU的同学问了我几道题。
/*
* divpwr2 - Computer x/(2^n). for 0<= n <=30
* Legel ops: ! ~ & ^ | + << >>
* Max ops: 15
*/
int divpwr(int x, int n)
{
int tmp = ((x^(x>>31))) + !!(x>>31))>>n;
return (tmp^(x>>31)) + !!(x>>31);
}
位运算实现条件判断
/*
* conditional - same as x ? y:z
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 16
*/
int conditional(int x, int y, int z)
{
x = (x|(~x+1)>>31);
return (y&x)|(z&(~x));
}
位运算实现绝对值
/*
* absval - absolute value of x
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 10
*/
int absval(int x)
{
return (x^(x>>31)) + !!(x>>31);
}
位运算实现循环右移
/*
* rotateright - rotate x to the right by n (0<= n <= 31)
* Example: roteteright(0x87654321, 1) = 0x18765432
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 25
*/
int rotateright(int x, int n)
{
int a = x >> n;
int b = x & (1<<n + (~0));
int c = (b<<(32+((~n)+1)));
return c|a;
}
位运算实现非运算
/*
* bang - Compute !x without using !
* Example: bang(3) = 0, band(0) = 1
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 25
*/
int band(int x)
{
return (x|(~x+1)>>31)+1;
}