zoukankan      html  css  js  c++  java
  • [算法]快速判断一个数是否是2的幂次方

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(void)
     4 {
     5     int Number;
     6     scanf_s("%d", &Number);
     7     if (0 == (Number & (Number - 1)))
     8     {
     9         printf("Success.
    ");
    10     }
    11     else
    12     {
    13         printf("Error.
    ");
    14     }
    15     system("pause");
    16     return 0;
    17 }

    利用与(&)运算符

    可以快速判断一个数是否为2的幂次方

    将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了N个0, 因此问题可以转化为判断1后面是否跟了N个0就可以了。

    如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1,因此将原来的数与去减去1后的数字进行与运算后会发现为零。

    因此,最快速的方法是:

          (Number & Number - 1) == 0

    因为2的N次方换算是二进制为10……0这样的形式,与(&)上自己-1的数,这们得到结果为0。

    例如:8的二进制为1000,8-1=7,7的二进制为111,两者相与的结果为0,计算如下:

    (1000)&(111)=0000

  • 相关阅读:
    第三次jsp作业
    快速排列 使用链表
    Cross
    题目
    ranch
    robot
    Mold
    Mold2
    OX_pattern
    KSC sort
  • 原文地址:https://www.cnblogs.com/LeeCookies/p/12662937.html
Copyright © 2011-2022 走看看