判断一个数是否是2的幂次方以及保留一个数的最高位的方法

#include <stdio.h>

int check_power(unsigned int n)
{

  /****************************************

   * 如果n是2的幂,那么 (n-1)也就是其二进制全为1的数

  *****************************************/
  if (n
& (n-1))
  {
    return 1;
  }
  return 0;
}
unsigned
int get_next_power(unsigned int n)
{
  unsigned int next =
n;
  unsigned int flag = 0;

  /***************************************

   * 将n逐次右移1位,记录移动的次数,然后用1左移记录的次数

   ****************************************/

  while(next)
  {
    next =
(next>>1);
    flag++;
  }

  next = (1 << flag);

  return (next);
}
int main()
{
  unsigned int nMax =
0x00800000;
  unsigned int ii = 1;

  for(ii=1; ii<=nMax; ii++)
  {
    if
(check_power(ii))
    {
      printf("[%u => %u]\n", ii,
get_next_power(ii));
    }
    else
    {
      printf("[%u]\n",
ii);
    }
  }

  return 0;
}

时间: 2024-08-02 15:09:35

判断一个数是否是2的幂次方以及保留一个数的最高位的方法的相关文章

快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方!

将4的幂次方写成2进制形式后,很容易发现有个特点,2进制中只有1个1(1在奇数位置),并且后面跟了偶数个0:因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制可以写为2^(2*n),即也可以写成2的幂次方,当然就满足2的幂次方的条件,即num&(num-1)==0. 思路:首先用条件num&(num-1)==0来判断是否为2的幂次方,若不满足,则不是.若满足,再用条件num&0x5555 5555 来判断,若为真,则这个整数是4 的幂次方.否则不是. #i

判断一个整数是否是 2 的幂次方

我的思路很简单,就是这样: bool check(int n) { while (n != 2) { if (n % 2 != 0) { return false; } n /= 2; } return true; } bool isPowerOfTwo(int n) { if (n == 0){ return false; } if (n == 1){ return true; } return check(n); } 因为我都是自学,所以算法啥的我觉得这肯定不是最快的方法,果然我在另外一些博

【题解】二的幂次方

题目描述 任何一个正整数都可以用2的幂次方表示.例如:137=27+23+2027+23+20,同时约定次方用括号来表示,即abab可表示为a(b). 由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7=22+2+2022+2+20(2121用2表示),3=2+202+20, 所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0). 又如:1315=210+28+25+2+1210+28+25+2+1,所以1315最后可表示为:2(2(2+2(0))+

判断一个数是否为2的幂

判断一个数是否为2的幂 思想 例1. 4的补码为: 00000100 3的补码为: 00000011 4 & 3 = 0 因此 n & n-1 == 0,此数即为2的幂(n > 0) 例2. 4的补码为: 00000100 -4的补码为: 11111100 4 & -4 = 4 因此 n & -n == n,此数即为2的幂(n > 0) 公式 n & n - 1 == 0 (n > 0) 或 n & -n == n (n > 0) 原

不用算术运算符,如何判定一个数是否是二的幂?

这是第一篇博文,我想写下的就是今天学习到的一个算法 即:不用算术运算符判定一个数是否是二的幂: public static bool powerOfTwo(int x) { return (x & (x - 1)) == 0; } X如果是2的幂,那么将x转化成二进制数 就只有首位为1 其他位均为0(4 100,8 1000 16 10000), 那么x-1 就是一个首位为0 其他位均为1的数(3 011, 7 0111 )这个形式的 如果x 是2的幂 那么 x和(x-1)做与运算 返回的值就必

zoj 1041 Transmitters 判断一个可以移动的半圆最多可容纳的点的个数

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=41 题意:  判断一个可以移动的半圆最多可容纳的点的个数 . 分析:  计算在圆内的点, 然后  枚举 这些点, 将点 和 圆心 的连线 的直径 的左右点 统计, 最大 值 即可. 代码如下: const double EPS = 1e-12; const int Max_N = 160; double add(double a, double b){ return

【C语言】判断一个数是否为2的n次方

//判断一个数是否为2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一个1,判断是否为0 return -1; return 1; } int main() { int a; printf("请输入数字:"); scanf_s("%d",&a); if (is_two_n(a)==1) printf("该数是2的次方\n"

判断一个整数不是2的阶次方树

如果是一个2的阶次方,那么它的二进制数的首位一般是1,后面接若干个0.比如8就是1000,64是100 0000. 如果将这个数减1后,再与该数做和&运算,则改全为0. package cn.usst.DataTest; import java.io.*; /** * 从键盘输入一个值 */ public class InputData { static private String s = ""; static public void input() { BufferedRe

解题报告——2018级2016第二学期第四周作业 (2的幂次方)

解题报告——2018级2016第二学期第四周作业 题目: 描述 任何一个正整数都可以用2的幂次方表示.例如:137=27+23+20. 同时约定方次用括号来表示,即ab 可表示为a(b). 由此可知,137可表示为:2(7)+2(3)+2(0) 进一步:7= 22+2+20   (21用2表示) 3=2+20 所以最后137可表示为: 2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如:1315=210 +28 +25 +2+1 所以1315最后可表示为: 2(2(2+2(0))+