日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Question
  • Answer 1.0
  • Answer 2.0 按位與運算 &
  • 須知
    • 十進制轉二進制
    • 八位二進制
    • 按位與運算 &


Question

引入… 先看個阿里巴巴的面試題吧

如何使用最高效的方式來判斷一個數是否是2的N次方? 先思考下哈














Answer 1.0

分析下:

2的N次方嘛 ,舉個例子 2 4 8 16是 2的N次方, 6 , 10 不是2的N次方。

2的N次方 ====> 就可以看成 這個數是不是可以拆成 N個2相乘嘛

那根據這個思路的話 ,寫個偽代碼

while(n>1){n % 2 == 0 ---> 如果除以2不為0 ,肯定不是2的N次方 n = n / 2 ; ---> 繼續除以2 (即我們上面說的拆成N個2),循環判斷 }

分析好了,我們來用Java語言實現下

/*** @author 小工匠* @version v1.0* @create 2019-11-19 21:22* @motto show me the code ,change the word* @blog https://artisan.blog.csdn.net/* @description**/public class Test {/*** 思路:* 如果某個數除以2 不等于0 ,最起碼已經不是2的倍數了,更不要是2的N次方了 ,* 比如 3 ,5 ,7這種數字* 利用該特性循環判斷** @param args*/public static void main(String[] args) {int n = 6;// 原始數值int temp = n; // 臨時變量while (temp > 1) {// while循環if (temp % 2 == 0) { // 判斷是否是2的倍數temp = temp / 2; // 除以2 繼續下一次的循環判斷System.out.println(temp == 1 ? ("原始數值【" + n + "】是2的N次方") : ("分析中...." + temp));} else {// 不是2的倍數,肯定不是2的N次方了,直接break跳出循環System.out.println(n + "不是2的N次方");break;// 終止循環}}} }

好了,算是實現了, 其實看看這個代碼是比較挫的,有沒有更好的思路呢 ?

提示一下: 按位與運算


Answer 2.0 按位與運算 &

為啥能想到這種思路,其實也是要靠積累的,對數字要有足夠的敏感,看到某個十進制的數,可以馬上想到對應的二進制數。

八位二進制嘛 ,為啥是8位,請移步下方的須知
我們來看下幾個數字

2 ,4 ,8 ,16

我們來看下 2 ,4 ,8 ,16 這幾個十進制的是 對應的 二進制 ,咋算的 請移步下方的須知

2 = 10 ---->補位湊成8-----> 00000010 4 = 100 ---->補位湊成8-----> 00000100 8= 1000 ---->補位湊成8-----> 00001000 16=10000 ---->補位湊成8-----> 00010000

接下來我們看下 比2 4 8 16 小1的十進制整數,對應的二進制

2 = 10 ---->補位湊成8-----> 00000010 1 = 01 ---->補位湊成8-----> 000000014 = 100 ---->補位湊成8-----> 00000100 3 = 011 ---->補位湊成8-----> 000000118 = 1000 ---->補位湊成8-----> 00001000 7 = 0111 ---->補位湊成8-----> 00000111 16 = 10000 ---->補位湊成8-----> 00010000 15 = 01111 ---->補位湊成8-----> 00001111

按二進制位進行“與”運算 ,只有兩個數的二進制同時為1,結果才為1,否則為0。

我們看下上面的規律哈 n 和 n-1 這兩個十進制的整數 ,按照二進制進行 按位與運算后,為0,那么這個n就是2的N次方。

偽代碼如下

if((n & (n-1)) == 0)) -----> n 就是 2的次方

接下來我們用java實現以下

/*** @author 小工匠* @version v1.0* @create 2019-11-19 21:27* @motto show me the code ,change the word* @blog https://artisan.blog.csdn.net/* @description**/ public class TestA {/*** 思路:* 按位與運算 & , 兩個數字按照二進制的形式進行"與"運算 ,如果結果為0 ,則是2的N次方* @param args*/public static void main(String[] args) {int n = 128 ;System.out.println((n&(n-1)) == 0 ? n + "是2的N次方" : n + "不是2的N次方");} }

須知

十進制轉二進制

十進制整數轉換為二進制整數采用"除2取余,逆序排列"法。

具體做法:

用2整除十進制整數,可以得到一個商和余數;

再用2去除商,又會得到一個商和余數,如此進行,直到商為小于1時為止,

然后把先得到的余數作為二進制數的低位有效位,后得到的余數作為二進制數的高位有效位,依次排列起來。

一圖勝千言 ,來吧


八位二進制

我們常說 “八位二進制” ,到底是啥意思嘞 ?

說起二進制 ,其實就要從計算機的的組成-電子元件說起, 這些元件一般都是只有兩種穩定的工作狀態,用高、低兩個電位表示“0”和“1”在物理上是最容易實現的。

那八位二進制又是什么妖魔鬼怪呢? 我們知道 電腦的最小存儲單位是字節Byte ,即我們常說的大B, 一個字節, 是由八位二進制位組成的,就是這八位數字只是由“0”和“1”兩個數字組成 ,比如 11111000,00000001,00000101等等。

八位二進制 就是一個字節(Byte)的大小。

1個英文字母、英文標點、半角數字 在計算機是以八位二進制數保存 就是一個字節大小,

1個漢字(包括中文標點 全角數字)就是2個字節 (十六位二進制)

1位二進制大小就是1bit ,就是我們說的 小b。


在計算機科學中,bit通常用于表示信息的最小單位,也可以被稱作是二進制位。在計算機學科中,bit一般用0和1表示。Byte也就是人們常說的字節,通常由8個位(8bit)組成一個字節(1Byte)

比如我們常見的基本類型的取值范圍

bit與Byte之間可以進行換算,具體的換算關系為:1Byte=8bit

在計算機網絡或者是網絡運營商中,一般而言,寬帶速率的單位用bps(或b/s)表示;bps表示比特每秒即表示每秒鐘傳輸多少位信息,是bit per second的縮寫 小b 。 在實際所說的1M帶寬的意思是1Mbps(是兆比特每秒Mbps不是兆字節每秒MBps)。

1B=8b 1B/s=8b/s(或1Bps=8bps)1KB=1024B 1KB/s=1024B/s1MB=1024KB 1MB/s=1024KB/s

規范提示:實際書寫規范中B應表示Byte(字節),b應表示bit(比特),但在平時的實際書寫中有的把bit和Byte都混寫為b ,如把Mb/s和MB/s都混寫為Mb/s,導致人們在實際計算中因單位的混淆而出錯。切記注意!!!


按位與運算 &

定義: 參加運算的兩個數,按二進制位進行“與”運算

運算規則:只有兩個數的二進制同時為1,結果才為1,否則為0。

比如 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。

舉個例子 :

3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值為1。

總結

以上是生活随笔為你收集整理的Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。