力扣- -231. 2的幂

文章目录

  • 力扣- -231. 2的幂
    • 一、题目描述
    • 二、问题分析
    • 三、代码
      • 方法一:暴力统计
      • 方法二:位运算(获取二进制中最右边的 1)
      • 方法三:位运算(去除二进制中最右边的 1)

看一道对位运算特别巧的简单题

一、题目描述

class Solution {public:bool isPowerOfTwo(int n) {}
};

二、问题分析

  • 这道题的主要思想是数字n的特殊性
  • 因为数字n是2的幂(注意是2的幂,并不是2的倍数),那么这道题就简单了,因为2的幂的数字的特性就是n的所有比特位中只有一个比特位为1

三、代码

方法一:暴力统计

class Solution {public:bool isPowerOfTwo(int n) {if(n == 0){return false;}while (n % 2 == 0) n /= 2;return n == 1;}
};
  • 时间复杂度为 O(logN)O(logN)O(logN)
  • 该问题将通过位运算在 O(1)O(1)O(1) 的时间复杂度解决,通过使用如下的按位技巧:
  • 如何获取二进制中最右边的 1:xxx & (−x)(-x)(−x)。
  • 如何将二进制中最右边的 1 设置为 0:xxx & (x−1)(x - 1)(x−1)。

方法二:位运算(获取二进制中最右边的 1)

  • 获取最右边的 1:xxx & (−x)(-x)(−x)。

  • 首先讨论为什么 xxx & (−x)(-x)(−x)可以获取到二进制中最右边的 1,且其它位设置为 0。

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

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

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

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

  • 检测是否为 2 的幂:

  • 我们通过 xxx & (−x)(-x)(−x) 保留了最右边的 1,并将其他位设置为 0 若 xxx 为 2 的幂,则它的二进制表示中只包含一个 1,则有 xxx & (−x)=x(-x) = x(−x)=x。

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

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

class Solution {public:bool isPowerOfTwo(int n) {if(n == 0){return false;}long long ret = (long long)n;return (ret & (-ret)) == ret;}
};
  • 时间复杂度:O(1)O(1)O(1)。
  • 空间复杂度:O(1)O(1)O(1)

方法三:位运算(去除二进制中最右边的 1)

  • 去除二进制中最右边的 1:xxx & (x−1)(x - 1)(x−1)

  • 首先讨论为什么 xxx & (x−1)(x - 1)(x−1) 可以将最右边的 1 设置为 0。

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

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

  • 检测是否为 2 的幂:

  • 2 的幂二进制表示只含有一个 1。

  • xxx & (x−1)(x - 1)(x−1) 操作会将 2 的幂设置为 0,因此判断是否为 2 的幂是:判断 xxx & (x−1)==0(x - 1) == 0(x−1)==0。

class Solution {public:bool isPowerOfTwo(int n) {if(n == 0){return false;}long long ret = (long long)n;return (ret & (ret - 1)) == 0;}
};
  • 时间复杂度:O(1)O(1)O(1)。
  • 空间复杂度:O(1)O(1)O(1)

总之,这道题还是比较简单的,就是位运算的运用

力扣- -231. 2的幂相关推荐

  1. 力扣231.2的幂 C语言

    题目描述 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 20 = 1示例 2:输入: 16 输出: true 解释: 24 = 16示例 ...

  2. 力扣: 231. 2的幂 【位运算】

    题解: 你通过上图会发现:一个数只要是2的幂次方.那么经过n次除以2其结果终为1 且这个数对于2取余的结果一直是0 那么代码如下: bool isPowerOfTwo(int n){if(n==0)r ...

  3. 力扣 342.4的幂

    题目描述 给定一个整数,写一个函数来判断它是否是 4 的幂次方.如果是,返回 true :否则,返回 false . 整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x 示例 1:输 ...

  4. 力扣326.3的幂 C/C++

    题目描述 给定一个整数,写一个函数来判断它是否是 3 的幂次方.如果是,返回 true :否则,返回 false . 整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x 示例 1:输 ...

  5. $力扣 LeetCode231. 2的幂 #在所有Java提交中击败了100%的用户 @FDDLC

    题目描述: 231. 2的幂 - 力扣(LeetCode) (leetcode-cn.com) Java代码: class Solution {public boolean isPowerOfTwo( ...

  6. 【力扣】2的幂,3的幂,4的幂

    一,循环法,通解-O(logN) 虽然这些题目中的进阶部分都说不用循环或者递归,但是对于3的幂这题来说,除非记得3的19次方是int型里最大的3的幂(然后判断n能不能被其整除),否则3的幂这题就只能用 ...

  7. 20210307:力扣第231周周赛(上)

    力扣第231周周赛(上) 题目 思路与算法 代码实现 写在最后 题目 检查二进制字符串字段 构成特定和需要添加的最少元素 思路与算法 题意读懂即可,意思是包含01序列与否,单独的一个1也符合要求 第二 ...

  8. 第 254 场力扣周赛(KMP、贪心、快速幂、二分+多源bfs、并查集 + 时光倒流)

    第 254 场力扣周赛 稀里糊涂双眼双眼惺忪的做了三道,错了4次...还是600来名 5843. 作为子字符串出现在单词中的字符串数目 题目描述 给你一个字符串数组 patterns 和一个字符串 w ...

  9. 力扣OJ 剑指 Offer(1-30)

    目录 剑指 Offer 03. 数组中重复的数字 剑指 Offer 04. 二维数组中的查找 剑指 Offer 05. 替换空格 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 07. ...

最新文章

  1. Mobile OpenCart 自适应主题模板 ABC-0074
  2. “基础数学没用”,百年名校要裁撤数学系补贴AI研究,4000多学者联合抗议
  3. linux 信号处理
  4. Android OkHttp的使用心得
  5. python之列表、字典、集合
  6. web设计师和前端设计师的互动—前端工程师应该具备的三种思维
  7. 科研实习 | 约翰霍普金斯大学Alan Yuille教授招收计算机视觉暑期科研实习生
  8. python手机号码正确编程_python 小练习之生成手机号码
  9. Python 的 requests 库的用法
  10. jqueryUI日期控件和时间控件
  11. php培训周期,合肥PHP培训周期为什么往往比2个月要长?
  12. IDEA连接数据库后在数据表里添加外键的两种方式
  13. js 万年历农历转阳历 方法_JS实现带阴历的日历功能详解
  14. android实现高德地图集成
  15. i7 13650hx参数 酷睿i713650hx性能怎么样相当于什么水平
  16. Win10怎么隐藏磁盘分区
  17. 微软赵立威:云计算技术是移动互联网开发核心
  18. 浙江大学计算机系81级同学会,无线电系64级校友毕业50周年聚会
  19. 视频教程-微信小程序项目实战之我画你猜视频课程-微信开发
  20. (二)、Apache doris编译

热门文章

  1. 对于linux下指令的进一步扩充与巩固
  2. CSS实现【表格内容超过一行的部分,用省略号代替】
  3. linux下安装node.js
  4. 韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
  5. 极客班C++ STL(容器)第二周笔记
  6. jquery中Live方法不可用,Jquery中Live方法失效
  7. python交互模式设置及VIM的tab补齐
  8. ora-01658 :无法为表空间USERS 中的段创建INITIAL区
  9. C#+Sql数据库备份
  10. CodeForces - 1480D2 Painting the Array II(dp)