Dou*_*owZ 4 haskell bitwise-operators
我想做一个简单的测试,以确定我正在制作的一位护卫员在Haskell中数字是否为2的幂。
目的是确定数字是否为偶数(而不是2的幂),数字是否为奇数或数字是否为2的幂。
我想做类似的事情:
function n
| n `mod` 2 == 1 = 1
| if n is to the power of 2 = 2
| otherwise = 0
Run Code Online (Sandbox Code Playgroud)
我看过一些线程,但是它们都说要使用按位运算符:
(n & (n - 1)) == 0
Run Code Online (Sandbox Code Playgroud)
但是它说
不在范围内:“&”
当我尝试这样做时,因此不确定Haskell是否允许这样做。
Wil*_*sem 10
Haskell具有按位运算,但是它们的名称略有不同。实际上,您可以使用该(.&.) :: Bits a => a -> a -> a
函数进行按位与运算。
因此,您可以通过以下方式进行检查:
import Data.Bits(Bits, (.&.))
isPower2 :: (Bits i, Integral i) => i -> Bool
isPower2 n = n .&. (n-1) == 0
Run Code Online (Sandbox Code Playgroud)
请注意,您提出的解决方案还将包括零以及2的幂。确实,如果我们评估前1000个数字,我们将得到:
Prelude Data.Bits> filter isPower2 [0 .. 1000]
[0,1,2,4,8,16,32,64,128,256,512]
Run Code Online (Sandbox Code Playgroud)