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;
}