麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方?

2020-01-26 16:09:44
字體:
供稿:網(wǎng)友
將2的冪次方寫成二進制形式后,很容易就會發(fā)現(xiàn)有一個特點:二進制中只有一個1,并且1后面跟了n個0; 因此問題可以轉(zhuǎn)化為判斷1后面是否跟了n個0就可以了。
如果將這個數(shù)減去1后會發(fā)現(xiàn),僅有的那個1會變?yōu)?,而原來的那n個0會變?yōu)?;因此將原來的數(shù)與去減去1后的數(shù)字進行與運算后會發(fā)現(xiàn)為零。
最快速的方法:
(number & number - 1) == 0
原因:因為2的N次方換算是二進制為10……0這樣的形式(0除外)。與上自己-1的位數(shù),這們得到結(jié)果為0。例如。8的二進制為1000;8-1=7,7的二進制為111。兩者相與的結(jié)果為0。計算如下:
1000
& 0111
-------
0000
使用遞歸來實現(xiàn)的代碼如下:
復制代碼 代碼如下:

#include "stdio.h"
#include "stdlib.h"
int log2(int value)   //遞歸判斷一個數(shù)是2的多少次方
{
 if (value == 1)
  return 0;
 else
  return 1+log2(value>>1);
}
int main(void)
{
 int num;
 printf("請輸入一個整數(shù):");
 scanf("%d",&num);
 if(num&(num-1))  //使用與運算判斷一個數(shù)是否是2的冪次方
  printf("%d不是2的冪次方!/n",num);
 else
  printf("%d是2的%d次方!/n",num,log2(num));
 system("pause");
 return 0;
}

使用非遞歸來實現(xiàn)的代碼如下:
復制代碼 代碼如下:

#include "stdio.h"
#include "stdlib.h"
int log2(int value)   //非遞歸判斷一個數(shù)是2的多少次方
{
 int x=0;
 while(value>1)
 {
  value>>=1;
  x++;
 }
 return x;
}
int main(void)
{
 int num;
 printf("請輸入一個整數(shù):");
 scanf("%d",&num);
 if(num&(num-1))     //使用與運算判斷一個數(shù)是否是2的冪次方
  printf("%d不是2的冪次方!/n",num);
 else
  printf("%d是2的%d次方!/n",num,log2(num));
 system("pause");
 return 0;
}

擴展:求一個數(shù)n的二進制中1的個數(shù)。
非常巧妙地利用了一個性質(zhì),n=n&(n-1) 能移除掉n的二進制中最右邊的1的性質(zhì),循環(huán)移除,直到將1全部移除,這種方法將問題的復雜度降低到只和1的個數(shù)有關(guān)系。代碼如下:
復制代碼 代碼如下:

int Func3(int data)
{   //利用了data&(data-1)每次都能移除最右邊的1,移除了多少個1,就是包含了幾個1
 int count = 0;
 while (data)
 {
  data = data & (data-1);
  count++;
 }
 return count;
}

擴展問題二:
A和B的二進制中有多少位不相同。這個問題可以分為兩步,(1)將A和B異或得到C,即C=A^B,(2)計算C的二進制中有多少個1。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 黄视频免费在线观看 | 精品一区二区三区日本 | 成人毛片在线免费看 | 日韩精品中文字幕在线播放 | 特级无码毛片免费视频尤物 | 成人做爰高潮片免费视频美国 | 成人电影毛片 | 在线亚洲欧美日韩 | 亚洲电影免费观看国语版 | 超碰97人| 国产一区二区在线观看视频 | 国产视频在线观看一区二区三区 | 国产羞羞视频在线观看免费应用 | 欧美高清第一页 | 欧美大屁股精品毛片视频 | 免费一级毛片免费播放 | 色悠悠久久久久 | 亚洲福利在线视频 | 欧美在线一级 | 成人毛片在线免费观看 | 欧美性黄 | 91成人午夜性a一级毛片 | 久章草影院 | 欧美高清一级片 | 免费午夜网站 | 国产自在自线午夜精品视频在 | 人人舔人人插 | 亚洲视频在线免费看 | 欧美精品久久久久久久久久 | 成人性生活视频在线播放 | 欧美成年性h版影视中文字幕 | 国产69精品久久久久久 | 国产成人精品一区二区仙踪林 | 国产午夜精品一区二区三区嫩草 | 失禁高潮抽搐喷水h | 免费在线观看亚洲 | 激情网站免费观看 | 日本网站在线播放 | 欧美精品色精品一区二区三区 | 欧美一级棒 | 全免费午夜一级毛片真人 |