如何测试数字是否为2的幂?

问题描述 投票:4回答:2

我想做一个简单的测试,确定我正在制作的一个护卫员在Haskell中数字是否为2的幂。

目的是确定数字是否为偶数(不是2的幂),数字是否为奇数或数字是否为2的幂。

我想做类似的事情:

function n
  | n `mod` 2 == 1 = 1
  | if n is to the power of 2 = 2
  | otherwise = 0

我看过一些线程,但是他们都说要使用按位运算符:

(n & (n - 1)) == 0

但是它说

不在范围内:‘&’

[当我尝试这样做时,因此不确定Haskell是否允许这样做。

haskell bitwise-operators
2个回答
10
投票

Haskell具有按位运算,但是它们的名称略有不同。实际上,您可以使用(.&.) :: Bits a => a -> a -> a函数进行按位与。

因此,您可以使用:

(.&.) :: Bits a => a -> a -> a

请注意,您提出的解决方案还将包括零以及2的幂。确实,如果我们评估前1000个数字,则会得到:

import Data.Bits(Bits, (.&.))

isPower2 :: (Bits i, Integral i) => i -> Bool
isPower2 n = n .&. (n-1) == 0

2
投票

另一种方法是将Prelude Data.Bits> filter isPower2 [0 .. 1000] [0,1,2,4,8,16,32,64,128,256,512] 函数与基数为logBase一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.