亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言判斷一個數是否是2的冪次方或4的冪次方

2020-01-26 14:34:04
字體:
來源:轉載
供稿:網友

快速判斷一個數是否是2的冪次方,若是,并判斷出來是多少次方!
將2的冪次方寫成二進制形式后,很容易就會發現有一個特點:二進制中只有一個1,并且1后面跟了n個0; 因此問題可以轉化為判斷1后面是否跟了n個0就可以了。

如果將這個數減去1后會發現,僅有的那個1會變為0,而原來的那n個0會變為1;因此將原來的數與去減去1后的數字進行與運算后會發現為零。

最快速的方法:

   (number & number - 1) == 0

原因:因為2的N次方換算是二進制為10……0這樣的形式(0除外)。與上自己-1的位數,這們得到結果為0。例如。8的二進制為1000;8-1=7,7的二進制為111。兩者相與的結果為0。計算如下:

     1000   & 0111    -------    0000

使用遞歸來實現的代碼如下:

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

使用非遞歸來實現的代碼如下:

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

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

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。


快速判斷一個數是否是4的冪次方,若是,并判斷出來是多少次方!
將4的冪次方寫成二進制形式后,很容易就會發現有一個特點:二進制中只有一個1(1在奇數位置),并且1后面跟了偶數個0; 因此問題可以轉化為判斷1后面是否跟了偶數個0就可以了。

4的整數次冪的二進制數都為 (4)100、(16)10000、(64)1000000......

另外,4的冪次方4^n也可以寫為2^(2*n),即也可以寫為2的冪次方,當然就滿足2的冪次方的條件了,即num & num-1==0。

思路:首先用條件num & num-1==0來判斷是否為2的冪次方,若不滿足,則不是。若滿足,在用條件num & 0x55555555來判斷,若為真,則這個整數是4的冪次方,否則不是。

使用遞歸來實現的代碼如下:

#include "stdio.h" #include "stdlib.h"  bool fn(unsigned int x)   //判斷x是否是4的冪次方 {  if ( x & (x - 1) )     //判斷x是否為2的冪次方    return false;  return x & 0x55555555;   //判斷1是否在奇數位置上 }  int log4(int value)   //遞歸判斷一個數是4的多少次方 {   if (value == 1)     return 0;   else   {     value>>=1;    //往右移位     return 1+log4(value>>1);    //往右移位   } }  int main(void) {   int num;   printf("請輸入一個整數:");   scanf("%d",&num);   if(fn(num))   //使用與運算判斷一個數是否是2的冪次方     printf("%d是4的%d次方!/n",num,log4(num));   else     printf("%d不是4的冪次方!/n",num);   system("pause");   return 0; } 

使用非遞歸來實現的代碼如下:

#include "stdio.h" #include "stdlib.h"  bool fn(unsigned int x)   //判斷x是否是4的冪次方 {  if ( x & (x - 1) )     //判斷x是否為2的冪次方    return false;  return x & 0x55555555;   //判斷1是否在奇數位置上 }  int log4(int value)  //非遞歸判斷一個數是4的多少次方   {   int x=0;   while(value>1)   {     value>>=1;   //往右移位     value>>=1;     x++;   }   return x; }   int main(void) {   int num;   printf("請輸入一個整數:");   scanf("%d",&num);   if(fn(num))   //使用與運算判斷一個數是否是2的冪次方     printf("%d是4的%d次方!/n",num,log4(num));   else     printf("%d不是4的冪次方!/n",num);   system("pause");   return 0; } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕视频在线免费欧美日韩综合在线看| 久久亚洲精品视频| 97视频人免费观看| 亚洲欧美日韩一区在线| 色悠悠久久久久| 在线视频欧美日韩| 日韩福利视频在线观看| 欧美性猛交xxxxx水多| 91午夜理伦私人影院| 精品视频在线播放色网色视频| 九九热这里只有精品免费看| 国产精品私拍pans大尺度在线| 亚洲精品一区二三区不卡| 日韩免费电影在线观看| xxxx性欧美| 97国产一区二区精品久久呦| 2019亚洲男人天堂| 欧美日韩精品国产| 久久理论片午夜琪琪电影网| 国产精品美腿一区在线看| 欧美亚洲视频在线看网址| 中文字幕日韩av综合精品| 欧美激情极品视频| 91成品人片a无限观看| 91欧美精品午夜性色福利在线| 久久不射电影网| 国产精品嫩草影院一区二区| 欧美成人网在线| 亚洲天堂网站在线观看视频| 亚洲aaa激情| 国产精自产拍久久久久久| 亚洲人成网7777777国产| 欧美wwwxxxx| 国产精品第1页| 成人网址在线观看| 亚洲一区二区在线播放| 国产日韩精品在线播放| 国产日韩欧美中文| 日韩欧美国产高清91| 亚洲一区美女视频在线观看免费| 亚洲国产精品电影在线观看| 亚洲天堂免费观看| 久热99视频在线观看| 欧美精品少妇videofree| 亚洲国内精品在线| 欧美在线视频免费观看| 91精品国产亚洲| 国产精品白嫩初高中害羞小美女| 国产99视频在线观看| 黑人巨大精品欧美一区二区三区| 97热精品视频官网| 亚洲国产天堂久久综合| 91久久久久久久久久| 欧美小视频在线观看| 日韩精品视频在线播放| 九九热视频这里只有精品| 国产日韩欧美在线| 欧美精品一本久久男人的天堂| 久久男人的天堂| 精品视频—区二区三区免费| 国产精品一区专区欧美日韩| 色婷婷综合久久久久| 久久久91精品国产| 国产精品免费久久久久久| 中文字幕日韩专区| 91人人爽人人爽人人精88v| 国产午夜精品全部视频播放| 亚洲性生活视频| 亚洲91精品在线| 亚洲精品mp4| 欧美国产日韩一区二区| 久久久亚洲成人| 欧美激情国产高清| 色视频www在线播放国产成人| 久久久精品美女| 欧美高清视频在线| 欧美亚洲另类激情另类| 97成人精品区在线播放| 亚洲第一天堂av| 欧美色道久久88综合亚洲精品| 555www成人网| 亚洲国产成人久久综合一区| 久久久久日韩精品久久久男男| 亚洲男人天堂视频| 欧美—级a级欧美特级ar全黄| 欧美日韩一区二区免费视频| 亚洲激情中文字幕| 97视频在线看| 亚洲国产美女精品久久久久∴| 亚洲石原莉奈一区二区在线观看| 亚洲自拍av在线| 亚洲欧美另类中文字幕| 亚洲色图在线观看| 日韩欧美国产成人| 日韩成人免费视频| 国产www精品| 欧洲s码亚洲m码精品一区| 91精品国产自产在线观看永久| 亚洲一区二区三区四区视频| 日韩精品视频免费在线观看| 69久久夜色精品国产69| 久久亚洲影音av资源网| 久久国产精品视频| 欧美高清在线视频观看不卡| 国自产精品手机在线观看视频| 日韩中文在线观看| 久久久久久国产精品| 性色av一区二区三区| 国产美女直播视频一区| 亚洲无av在线中文字幕| 国产日韩在线一区| 久久久久久中文字幕| 91在线高清视频| 亚洲韩国欧洲国产日产av| 午夜欧美大片免费观看| 97视频人免费观看| 51ⅴ精品国产91久久久久久| 欧洲亚洲免费在线| 在线观看国产成人av片| 日韩成人av在线播放| 久久国产精彩视频| 久久久久久国产三级电影| 国产成人拍精品视频午夜网站| 视频直播国产精品| 中文字幕欧美日韩在线| 精品国产一区二区三区久久久狼| 日韩精品极品视频| 国产成人中文字幕| 欧美麻豆久久久久久中文| 久久久在线视频| 在线视频日韩精品| 91性高湖久久久久久久久_久久99| 日韩美女视频免费在线观看| 亚洲自拍欧美色图| 久久久久久久久久久av| 午夜精品在线观看| 91精品久久久久久久久久| 91亚洲国产精品| 亚洲电影在线观看| 亚洲国产精品成人一区二区| 国产成人一区二区在线| 精品夜色国产国偷在线| 性欧美xxxx交| 亚洲精品视频久久| 91在线视频九色| 青青草原成人在线视频| 国产精品视频专区| 97香蕉久久超级碰碰高清版| 日韩不卡在线观看| xxx欧美精品| 国产精品影片在线观看| www.日韩欧美| 国产精品第二页| 91视频免费网站| 久久久久久综合网天天| 在线观看日韩www视频免费| 久久久99久久精品女同性| 亚洲精品免费网站| 国产精品丝袜一区二区三区| 中文字幕日韩电影| 91高清在线免费观看| 韩国精品美女www爽爽爽视频| 中文综合在线观看| 亚洲免费精彩视频|