You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:10:29