X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FBits.hs;h=88f707affd6f8e5fcf0638dfd98669f9e1d3e013;hb=42acd5eac493493748281da8240ec6e98c9dbee9;hp=eb8ace1bd90a8e4ff044fb123fa5730a1f440d75;hpb=3a540635e558efbd275ae8bfa4326f5adfa96208;p=ghc-base.git diff --git a/Data/Bits.hs b/Data/Bits.hs index eb8ace1..88f707a 100644 --- a/Data/Bits.hs +++ b/Data/Bits.hs @@ -84,8 +84,11 @@ class Num a => Bits a where {-| Reverse all the bits in the argument -} complement :: a -> a - {-| Shift the argument left by the specified number of bits. - Right shifts (signed) are specified by giving a negative value. + {-| @'shift' x i@ shifts @x@ left by @i@ bits if @i@ is positive, + or right by @-i@ bits otherwise. + Right shifts perform sign extension on signed number types; + i.e. they fill the top bits with 1 if the @x@ is negative + and with 0 otherwise. An instance can define either this unified 'shift' or 'shiftL' and 'shiftR', depending on which is more convenient for the type in @@ -96,8 +99,8 @@ class Num a => Bits a where | i==0 = x | i>0 = x `shiftL` i - {-| Rotate the argument left by the specified number of bits. - Right rotates are specified by giving a negative value. + {-| @'rotate' x i@ rotates @x@ left by @i@ bits if @i@ is positive, + or right by @-i@ bits otherwise. For unbounded types like 'Integer', 'rotate' is equivalent to 'shift'. @@ -164,8 +167,11 @@ class Num a => Bits a where shiftL :: a -> Int -> a x `shiftL` i = x `shift` i - {-| Shift the argument right (signed) by the specified number of bits + {-| Shift the first argument right by the specified number of bits (which must be non-negative). + Right shifts perform sign extension on signed number types; + i.e. they fill the top bits with 1 if the @x@ is negative + and with 0 otherwise. An instance can define either this and 'shiftL' or the unified 'shift', depending on which is more convenient for the type in @@ -203,8 +209,8 @@ instance Bits Int where | i# >=# 0# = I# (x# `iShiftL#` i#) | otherwise = I# (x# `iShiftRA#` negateInt# i#) (I# x#) `rotate` (I# i#) = - I# (word2Int# ((x'# `shiftL#` i'#) `or#` - (x'# `shiftRL#` (wsib -# i'#)))) + I# (word2Int# ((x'# `uncheckedShiftL#` i'#) `or#` + (x'# `uncheckedShiftRL#` (wsib -# i'#)))) where x'# = int2Word# x# i'# = word2Int# (int2Word# i# `and#` int2Word# (wsib -# 1#))