编写一个函数来确定它是否是 2 的幂

发布于 2022-09-21 13:06:10 字数 2653 浏览 98 评论 0

给定一个整数,编写一个函数来确定它是否是 2 的幂。(范围:1 - 2^31-1)

测试用例:

  • 输入 : 16, 输出 : true 因为 2^4 = 16
  • 输入 : 18, 输出 : false

方法1

最明显的暴力方法就是除以 2,然后检查它是否达到 1。

var powerOftwo = function(n){
    if(n<=0) return false;
    while(n%2 == 0) n = n/2;
    return n == 1;
}

方法2

由于给出的范围在 0-2^31-1 之间,我们可以使用这个范围来计算各种可能的输出,将它们保存到一个集合中并进行检查:

 let set = new Set();

  for(let i=0;i<31;i++){
    set.add(Math.pow(2,i));
  }

  console.log(set);

  var powerOfTwo = function(n){
    if(set.has(n)) return true;
    return false;
  }

方法3

每一家公司提出一个看起来易于理解和实现的问题时,这个问题一定与位操作有关。

对于计算机来说,一切都归结为0和1的组合,包括数字。那么让我们来看看n=0到 31 时,表示 2^n 的数字是如何以位的形式表示的。

根据上图我们找到规律是:2 的幂的数字只有 1 位被设置为 1,其余的为 0。

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。

按位非操作符由一个波浪线(~)表示,,执行按位非的结果就是返回数值的反码。

var num1 = 25; // 二进制00000000000000000000000000011001
var num2 = ~num1; // 二进制11111111111111111111111111100110
alert(num2); // -26

按位与操作符由一个和号字符( & )表示,它有两个操作符数。从本质上讲,按位与操作就是将两个数值的每一位对齐,然后根据下表中的规则,对相同位置上的两个数执行按位与操作:

第一个数值的位第二个数值的位结果
111
100
010
000

按位或操作符由一个竖线符号(|)表示,同样也有两个操作数。按位或操作遵循下面这个真值表。

第一个数值的位第二个数值的位结果
111
101
011
000

按位异或操作符由一个插入符号(^)表示,也有两个操作数。以下是按位异或的真值表。

第一个数值的位第二个数值的位结果
110
101
011
000

因此,我们的代码归结为:

var powerOfTwo = function(n){
    n = n&(n-1);
    return n == 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

守不住的情

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

浪漫人生路

文章 0 评论 0

620vip

文章 0 评论 0

羞稚

文章 0 评论 0

走过海棠暮

文章 0 评论 0

你好刘可爱

文章 0 评论 0

陌若浮生

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文