Haskell中不使用import判断数字是否为2的幂的方法
不用import的Haskell判断2的幂方案
递归整除方案(最可靠)
2的幂的核心特征是:正整数,且能反复被2整除直到结果为1。基于这个特性可以写递归实现:
checkPowerTwo :: Int -> Bool checkPowerTwo num | num <= 0 = False -- 排除非正数,2的幂都是正整数 | num == 1 = True -- 1是2^0,符合条件 | odd num = False -- 不能被2整除直接排除 | otherwise = checkPowerTwo (num `div` 2) -- 递归处理除以2后的数
对数计算方案(注意精度限制)
利用数学特性:若num是2的幂,则以2为底的对数结果是整数。但要注意,当num过大时,整数转浮点数会丢失精度,导致判断错误,适合小范围整数场景:
checkPowerTwo :: Int -> Bool checkPowerTwo num | num <= 0 = False | otherwise = let logVal = logBase 2 (fromIntegral num) in logVal == fromIntegral (floor logVal)
补充:原位运算方法的修正
你原来用位运算的思路其实很高效,但忽略了num=0的情况(0不是2的幂,但原代码会返回True)。如果允许用Data.Bits的话,正确的写法应该是:
import Data.Bits checkPowerTwo :: Int -> Bool checkPowerTwo num = num > 0 && (num .&. (num - 1)) == 0
内容的提问来源于stack exchange,提问作者sallap99
相关产品推荐
相关产品推荐

