php判斷給定的整數是否是2的冪_C++_C語言判斷一個數是否是2的冪次方或4的冪次方,快速判斷一個數是否是2的冪次 - phpStudy...

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;

}

相關閱讀:

Ubuntu中為Android實現Application Frameworks層增加硬件訪問服務

實現類似facebook無刷新ajax更新

利用JS來控制鍵盤的上下左右鍵(示例代碼)

處理jsp顯示文字過長問題的解決方法

jQuery Ajax 實例代碼 ($.ajax、$.post、$.get)

Javascript 完美運動框架(逐行分析代碼,讓你輕松了運動的原理)

Win10屏幕亮度怎么調?Win10正式版調節屏幕亮度圖文教程(最新)

android中開啟actionbar的兩種方法

Win8如何打開文件資源管理器中的文件夾選項功能

SQL Server中的RAND函數的介紹和區間隨機數值函數的實現

極易被忽視的javascript面試題七問七答

一個JavaScript的求愛小特效

php根據日期顯示所在星座的方法

淺析echo(),print(),print_r(),return之間的區別

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534480.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 包編譯安裝mysql_CentOS7編譯安裝MySQL8.0.23和Python3.1.9

卸載mariadbrpm -qa | grep mariadbmariadb-libs-5.5.64-1.el7.x86_64yum remove mariadb-libs.x86_64 -y安裝高版本GCC,解決編譯中會遇到的GCC 5.3 or newer is required (-dumpversion says 4.8.5)cd /optyum install centos-release-scl -yyum install devtoolse…

python3.0下載用什么瀏覽器_無法讓Python下載網頁源代碼:“不支持瀏覽器版本”...

查看您列出的url,我執行了以下操作:使用wget下載了頁面將urllib與ipython一起使用并下載了頁面使用chrome,只保存了url所有3個都給了我相同的結果文件(相同的大小,相同的內容)。在這可能是因為我沒有登錄,但我確實看到…

java線程堆棧_深入JVM剖析Java的線程堆棧

在這篇文章里我將教會你如何分析JVM的線程堆棧以及如何從堆棧信息中找出問題的根因。在我看來線程堆棧分析技術是Java EE產品支持工程師所必須掌握的一門技術。在線程堆棧中存儲的信息,通常遠超出你的想象,我們可以在工作中善加利用這些信息。我的目標是…

java 文件下載方法_【工具類】Java后臺上傳下載文件的幾種方式

/*** 將本地照片上傳至騰訊云服務上*/public void uploadImage(String localImagePath) throws Exception {// 1.將訂單照片上傳至騰訊地圖眾包側提供的云服務上try {File imageFile new File(localImagePath);if (imageFile.exists()) {String url "http://" map…

java io流讀取txt文件_Java使用IO流讀取TXT文件

通過BufferedReader讀取TXT文件window系統默認的編碼是GBK,而IDE的編碼多數為UTF-8,如果沒有規定new InputStreamReader(new FileInputStream(file),“GBK”)為GBK會出現讀取內容亂碼。//文件路徑String filePath"C:/Users/Admin/Desktop/products.…

c 調用java程序_C ++可以調用Java代碼嗎?

小編典典是的,您當然可以。這是一個例子:這是java文件:public class InvocationHelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");System.out.println("Arguments sent to this pro…

java 大數類_Java大數類介紹

java能處理大數的類有兩個高精度大整數BigInteger和高精度浮點數BigDecimal,這兩個類位于java.math包內,要使用它們必須在類前面引用該包:importjava.math.BigInteger;和importjava.math.BigDecimal;或者importjava.math.*;以下從幾個方面對B…

java 畫樹_java – 如何繪制代表連接節點圖的樹?

我想在Java GUI中顯示樹,但我不知道如何.樹代表連接節點的圖形,如下所示:我應該說我有自己的樹類:public class BinaryTree{private BinaryNode root;public BinaryTree( ){root null;}public BinaryTree( Object rootItem ){root new BinaryNode( roo…

mysql 優化代碼_MySQL Order by 語句優化代碼詳解

Order by語句是用來排序的,經常我們會使用到Order by來進行排序,下面我給大家來講講Order by用法與優化排序,有需要的同學可參考MySQL Order By keyword是用來給記錄中的數據進行分類的。MySQL Order By Keyword根據關鍵詞分類ORDER BY keywo…

java.lang.class_關于Java.lang.Class的一些疑問

User.class可以在編譯時就確定下來Class的泛型,而new User().getClass()實際上是運行時才能確定下來實際是什么泛型。舉個例子:public class User{}public class Student extends User{public static void main(String[] args) {User user1 new User();…

java文件 linux_Linux執行Java文件

最近學習shell腳本,寫個簡單java類讓linux去執行java類沒別的東西,就引了一個fastjson的jar,寫了個main方法 序列化一個User對象 打印package com.lws.demo;import java.util.Date;import com.alibaba.fastjson.JSONObject;import com.lws.mo…

java 劊子手游戲_java基礎(九):容器

集合的引入List (ArrayList LinkedList)Set (HashSet LinkedHashSet TreeSet )Map (HashMap LinkedHashMap TreeMap)CollectionsIterator使用泛型1.為什么使用集合而不是數組?集合和數組相似點都可以存儲多個對象,對外作為一個整體存在數組的缺點長度必須…

java面試手寫單鏈表_(轉)面試大總結之一:Java搞定面試中的鏈表題目

packageLinkedListSummary;importjava.util.HashMap;importjava.util.Stack;/*** http://blog.csdn.net/luckyxiaoqiang/article/details/7393134 輕松搞定面試中的鏈表題目* http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)單鏈表** 目錄&#xff1a…

ccf認證俄羅斯方塊java_CCF認證歷年試題 - osc_h3robkrt的個人空間 - OSCHINA - 中文開源技術交流社區...

CCF認證歷年試題不加索引整理會死星人orz第一題:CCF201712-1 最小差值(100分)CCF201703-1 分蛋糕(100分)CCF201612-1 中間數(100分)CCF201609-1 最大波動(100分)CCF201604-1 折點計數(100分)CCF201509-1 數列分段(100分)CCF201503-1 圖像旋轉(100分)CCF201412-1 門禁…

mysql 變量作表名查詢_使用MySQL函數變量作為表名查詢

我需要有一個表中增加一定的ID(如AUTO_INCREMENT)函數使用MySQL函數變量作為表名查詢我有水木清華這樣DELIMITER $$DROP FUNCTION IF EXISTS GetNextID$$CREATE FUNCTION GetNextID(tblName TEXT, increment INT)RETURNS INTDETERMINISTICBEGINDECLARE NextID INT;SELECT MAX(c…

java 簽名 ecdsa_Java實現ECDSA簽名算法

ECDSA簽名算法package com.albedo.security;/*** DSA 加解密實現*/public class ECDSAUtils extends Base {//字符編碼public static final String ALGORITHM "EC";public static final String SIGN_ALGORITHM "SHA1withECDSA";/*** ECDSA 驗簽** param …

java異常處理方式推薦做法_談談Java異常處理這件事兒

此文已由作者謝蕾授權網易云社區發布。歡迎訪問網易云社區,了解更多網易技術產品運營經驗。前言我們對于“異常處理”這個詞并不陌生,眾多框架和庫在異常處理方面都提供了便利,但是對于何種處理才是最佳實踐,也是眾說紛紜。異常處…

as400和java的區別_文件傳輸協議和AS400

我目前收到以下錯誤:遠程服務器返回錯誤:(501)參數或參數中的語法錯誤 .我已經檢查了服務器并且文件確實存在,如果我打開命令提示符并鍵入以下代碼它可以工作:ftpopen 192.168.1.2cd /Imagesget S12345.jpeg這是正常的&#xff0c…

java中同時兩人提交數據_如何一起發送JSON請求和發布表單數據請求?

所以這是一個應該在POST請求中接受以下參數的API:token (as form data)apiKey (as form data){"notification": {"id": 1,"heading": "some heading","subheading": "some subheading","image&qu…

java 64內存不足_請教一個 Java 內存占用的問題

第 1 條附言 364 天前2020-03-04 01:08:55.525 [HikariPool-1 housekeeper] WARN c.z.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta1m5s643ms48?s450ns).2020-03-04 01:09:08.516 [task-11] ERROR o.s.s.s.TaskU…