在graphics.stanford.edu/~seander/bithacks.html的精神,我需要解决以下问题:
int x;
int pow2; // always a positive power of 2
int sgn; // always either 0 or 1
// ...
// ...
if(sgn == 0)
x -= pow2;
else
x += pow2;
Run Code Online (Sandbox Code Playgroud)
当然我需要避免有条件的.到目前为止,我想到的最好的是
x -= (1|(~sgn+1))*pow2
Run Code Online (Sandbox Code Playgroud)
但这涉及乘法,我也想避免.提前致谢.
编辑:谢谢大家,
x -= (pow2^-sgn) + sgn
Run Code Online (Sandbox Code Playgroud)
似乎做的伎俩!
我发现自己非常需要你的见解.
这是我感兴趣的对象:
class Mergable m where
merge :: m -> m -> Maybe m
mergeList :: [m] -> [m]
mergeList [] = []
mergeList [x] = [x]
mergeList (x:y:t) = r1 ++ mergeList (r2 ++ t)
where
(r1,r2) = case (x `merge` y) of
Just m -> ([ ], [m])
Nothing -> ([x], [y])
Run Code Online (Sandbox Code Playgroud)
但是我稍后会回来.现在我准备了一些例子:
data AffineTransform = Identity
| Translation Float Float
| Rotation Float
| Scaling Float Float
| Affine Matrix3x3
instance Monoid AffineTransform where
mempty = Identity …
Run Code Online (Sandbox Code Playgroud)