1 题目描述

2 解题思路

2.1 方法1 判断是不是整数


class Solution:def isPowerOfTwo(self, n: int) -> bool:if(n<=0):return Falseif(n&(n-1)==0):return Truereturn False

2.2 方法2 一直除2

如果n被2整除,就将n除2,看最后不能被2整除的时候,结果是否为1

class Solution:def isPowerOfTwo(self, n: int) -> bool:if(n<=0):return Falsewhile(n%2==0):n=n//2return(n==1)

2.3 方法3 x & (-x)

x & (-x) 可以获取到二进制中最右边的 1,且其它位设置为 0

在补码表示法中,−x=¬x+1。换句话说,要计算 −x,要将 x 所有位取反再加 1。

在二进制表示中,¬x+1 表示将该 1 移动到¬x 中最右边的 0 的位置上,并将所有较低的位设置为 0。而¬x 最右边的 0 的位置对应于 x 最右边的 1 的位置。

总而言之,−x=¬x+1,此操作将 x 所有位取反,但是最右边的 1 除外。

因此,x 和−x 只有一个共同点:最右边的 1。这说明 x & (-x) 将保留最右边的 1。并将其他的位设置为 0。

2 的幂在二进制中是有一个 1 后跟一些0

不是 2 的幂的二进制中有一个以上的 1

我们通过 x & (-x) 保留了最右边的 1,并将其他位设置为 0

若 x 为 2 的幂,则它的二进制表示中只包含一个 1,则有 x & (-x) = x。

若 x 不是 2 的幂,则在二进制表示中存在其他 1,因此 x & (-x) != x。

因此判断是否为 2 的幂的关键是:判断 x & (-x) == x。


class Solution:def isPowerOfTwo(self, n: int) -> bool:if(n<=0):return Falsetmp=n&(-n)return(tmp==n)

2.4 布莱恩-科尼根算法

当我们在number和number-1上做and位运算的时候,原数字最右边等于1的那一比特会被移除.

(number- 1) 代表了将 number 最右边的 1 设置为 0,并且将较低位设置为 1。

再使用与运算:则 x 最右边的 1 和就会被设置为 0,因为 1 & 0 = 0。

  1. 2 的幂二进制表示只含有一个 1。
  2. x & (x - 1) 操作会将 2 的幂设置为 0,因此判断是否为 2 的幂是:判断 x & (x - 1) == 0
    class Solution:def isPowerOfTwo(self, n: int) -> bool:if(n<=0):return Falseif(n&(n-1)==0):return Truereturn False

2.5 2^32的约数

由于这边题目里说了,所以n最大不会超过2^32

如果n是2的幂,那么它必然是2^32的约数,所以只需要判断2^32能否整除n即可

class Solution:def isPowerOfTwo(self, n: int) -> bool:if(n<=0):return Falsetmp=pow(2,32)if(tmp%n==0):return Truereturn False

文巾解题 231. 2的幂相关推荐

  1. 文巾解题 342. 4的幂

    1 题目描述 2 解题思路 2.1 方法1 判断log函数的结果是不是整数 class Solution:def isPowerOfFour(self, n: int) -> bool:if(n ...

  2. 文巾解题 326. 3的幂

    1 题目描述 2 解题思路 2.1 循环递归 class Solution:def isPowerOfThree(self, n: int) -> bool:if(n<=0):return ...

  3. 文巾解题 477. 汉明距离总和

    1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...

  4. 文巾解题 面试题 01.04. 回文排列

    1 题目描述 2 解题思路 2.1 哈希表 创建一个哈希表,记录每个元素出现的次数.如果出现次数为奇数的元素只有一个或者没有,那么就是一个回文排列 class Solution:def canPerm ...

  5. 文巾解题 15. 三数之和

    1 题目描述 2 解题思路 2.1 使用两数之和函数 这种做法目前超时了,如果大家有想到合适的减时间/剪枝的方法,欢迎私信or评论~ 两数之和的方法见文巾解题 1. 两数之和_刘文巾的博客-CSDN博 ...

  6. 文巾解题 1035. 不相交的线

    1 题目描述 2 解题思路 k条互不相交的直线分别连接了数组 nums1和nums2的 k 对相等的元素,而且这 k 对相等的元素在两个数组中的相对顺序是一致的,因此,这 k 对相等的元素组成的序列即 ...

  7. 文巾解题 278. 第一个错误的版本

    1 题目描述 2 解题思路 二分查找见:二分查找详解_刘文巾的博客-CSDN博客 class Solution(object):def firstBadVersion(self, n):left=1r ...

  8. 文巾解题 704. 二分查找

    1 题目描述 2 解题思路 二分查找见: 二分查找详解_刘文巾的博客-CSDN博客 class Solution(object):def search(self, nums, target):left ...

  9. 文巾解题 627. 变更性别

    1 题目描述 2 解题思路 回顾一下 UPDATE语句 2.1 CASE语句 回顾一下CASE语句(见数据库笔记: SQL_刘文巾的博客-CSDN博客 第六节) UPDATE salary SET s ...

最新文章

  1. ios 比 android 精致,iOS小组件对比ColorOS 11个性化,网友:这太好选了
  2. Facebook 开源高质量实例分割数据集 LVIS
  3. 浅谈高性能数据库集群——读写分离
  4. php 匹配正则,php正则匹配类
  5. 算法设计与分析——递归与分治策略——快速排序
  6. html纵向固定导航菜单代码,jQuery和css3响应式垂直固定导航菜单插件
  7. python三层设计_python 三层架构说明
  8. 小米11 Pro最新渲染图曝光:后置体积巨大的矩阵四摄
  9. python 保留顺序去重_Python入门很简单,只要掌握3456点
  10. 类中的__init__()
  11. Websense:别让移动设备触痛企业的安全神经
  12. 解决Eth0网卡不存在的情况_wuli大世界_新浪博客
  13. 微信小程序之头像裁剪,添加字幕,生成新图片下载等 解决真机调试和开发者工具 图片不显示等问题
  14. 八大算法实现(Java)
  15. html风琴图片展示,基于jquery的手风琴图片展示效果实现方法
  16. ffmpeg音视频转单声道16位16K赫兹小端点pcm音频
  17. 罗杨美慧 20190919-1 每周例行报告
  18. xmanager5连接CENTOS6
  19. beyond compare免安装版
  20. php环境扩展安装流程

热门文章

  1. 开源项目_可能使用到的开源项目集合
  2. 重装MS SQL Server 2000前必须彻底删除原安装文件!
  3. 值得研究的 开源数据库
  4. 剑指offer:二叉树的镜像
  5. 《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推
  6. 异常:This application has no explicit mapping for /error.以及spring.mvc.view.prefix配置解决
  7. numpy随机生成01矩阵_NumPy数组基本介绍
  8. java 模拟grep_java模拟linux命令grep
  9. java如何调windows框_java – JDialog.setAlwaysOnTop(true)将所有对话框带到Windows下的前面...
  10. vba sub是什么缩写_这些掌握了,你才敢说自己懂VBA