+#ifndef __GLASGOW_HASKELL__
+-- Crude implementation of bitwise operations on Integers: convert them
+-- to finite lists of Ints (least significant first), zip and convert
+-- back again.
+
+-- posAnd requires at least one argument non-negative
+-- posOr and posXOr require both arguments non-negative
+
+posAnd, posOr, posXOr :: Integer -> Integer -> Integer
+posAnd x y = fromInts $ zipWith (.&.) (toInts x) (toInts y)
+posOr x y = fromInts $ longZipWith (.|.) (toInts x) (toInts y)
+posXOr x y = fromInts $ longZipWith xor (toInts x) (toInts y)
+
+longZipWith :: (a -> a -> a) -> [a] -> [a] -> [a]
+longZipWith f xs [] = xs
+longZipWith f [] ys = ys
+longZipWith f (x:xs) (y:ys) = f x y:longZipWith f xs ys
+
+toInts :: Integer -> [Int]
+toInts n
+ | n == 0 = []
+ | otherwise = mkInt (n `mod` numInts):toInts (n `div` numInts)
+ where mkInt n | n > toInteger(maxBound::Int) = fromInteger (n-numInts)
+ | otherwise = fromInteger n
+
+fromInts :: [Int] -> Integer
+fromInts = foldr catInt 0
+ where catInt d n = (if d<0 then n+1 else n)*numInts + toInteger d
+
+numInts = toInteger (maxBound::Int) - toInteger (minBound::Int) + 1
+#endif /* !__GLASGOW_HASKELL__ */