程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話斷定一個數能否是2的冪次方或4的冪次方

C說話斷定一個數能否是2的冪次方或4的冪次方

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved