foundation-0.0.2: Foundation/Bits.hs
-- Extra bits stuff
module Foundation.Bits
( (.<<.)
, (.>>.)
, alignRoundUp
, alignRoundDown
) where
import Foundation.Internal.Base
import Foundation.Numerical
import Data.Bits
-- | Unsafe Shift Left Operator
(.<<.) :: Bits a => a -> Int -> a
(.<<.) = unsafeShiftL
-- | Unsafe Shift Right Operator
(.>>.) :: Bits a => a -> Int -> a
(.>>.) = unsafeShiftR
-- | Round up (if needed) to a multiple of @alignment@ closst to @m@
--
-- @alignment@ needs to be a power of two
--
-- alignRoundUp 16 8 = 16
-- alignRoundUp 15 8 = 16
alignRoundUp :: Int -- ^ Number to Align
-> Int -- ^ Alignment (power of 2)
-> Int
alignRoundUp m alignment = (m + (alignment-1)) .&. complement (alignment-1)
-- | Round down (if needed) to a multiple of @alignment@ closest to @m@
--
-- @alignment@ needs to be a power of two
--
-- > alignRoundDown 15 8 = 8
-- > alignRoundDown 8 8 = 8
alignRoundDown :: Int -- ^ Number to Align
-> Int -- ^ Alignment (power of 2)
-> Int
alignRoundDown m alignment = m .&. complement (alignment-1)