C說話斷定一個數能否是2的冪次方或4的冪次方。本站提示廣大學習愛好者:(C說話斷定一個數能否是2的冪次方或4的冪次方)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話斷定一個數能否是2的冪次方或4的冪次方正文
疾速斷定一個數能否是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; }