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次方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache Kafka-初体验Kafk
- 下一篇: Algorithms_入门基础_时间复杂