{-# LANGUAGE MagicHash #-}
module Math.NumberTheory.Utils.BitMask
( indexBitSet
) where
import Data.Bits (countTrailingZeros, finiteBitSize, testBit, (.&.))
import GHC.Exts (Int(..), Word(..), Ptr(..), iShiftRL#, indexWordOffAddr#)
indexBitSet :: Ptr Word -> Int -> Bool
indexBitSet :: Ptr Word -> Int -> Bool
indexBitSet (Ptr Addr#
addr#) i :: Int
i@(I# Int#
i#) = Word
word Word -> Int -> Bool
forall a. Bits a => a -> Int -> Bool
`testBit` (Int
i Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
fbs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1))
where
fbs :: Int
fbs = Word -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize (Word
0 :: Word)
logFbs# :: Int#
logFbs# = case Int -> Int
forall b. FiniteBits b => b -> Int
countTrailingZeros Int
fbs of
I# Int#
l# -> Int#
l#
word :: Word
word = Word# -> Word
W# (Addr# -> Int# -> Word#
indexWordOffAddr# Addr#
addr# (Int#
i# Int# -> Int# -> Int#
`iShiftRL#` Int#
logFbs#))