摘要:思路一比特位移動將比特位逆轉過來也就是將十進制數轉化為二進制數,再從右往左獲得每一位上的值,再將這個值添加至結果值中。根據分治思想,逆轉個比特位等價于分別將每個比特位進行逆轉。
題目要求
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000). Follow up: If this function is called many times, how would you optimize it?你首先需要知道的事
這里涉及了十進制和二進制之間轉化這個知識點。在數學中,我們都是采用十進制進行計算,通俗說就是逢十進一。但是計算機沒有那么多類型的信號來對應是十進制數中的十個數字,因此采用了二進制來進行計算。
二進制,也就是所謂的逢二進一,每一位上只有兩個數字,分別是0和1。每一個十進制都有一個唯一的二進制數作為對應。我們先來看一下十進制數的計算,比如945等價于9*100+4*10+5*1,也就是9*10^2 + 4*10^1 + 5*10^0。同理我們知道,二進制數011代表0*2^2 + 1*2^1 + 1*2^0也就是十進制的3。這樣,我們知道如何將二進制數轉化為十進制數。
那么計算機是怎么進行計算的呢?計算機首先將十進制數轉化為二進制數,再將二進制數根據需求進行計算。假設計算機需要計算3+6,那么轉化為二進制就是11+110,那么計算機的計算流程如下。
1.對齊 在左側補零位使的兩個數字位數相同,因此就是011+110
2.逢二進一 類似于十進制數的逢十進一,因此計算的結果為1001,轉化為十進制數就是9
基于二進制的位計算上,除去加減乘除,計算機還定義了一些其他的位運算符
>> 將二進制數右移,左邊根據數字的正負形補0或者補1,正數補0,負數補1。
<< 將二進制數左移,右邊補0
>>> 將二進制數右移,左邊補0
在這些知識的基礎上,我們再來看這道題目。
思路一:比特位移動將比特位逆轉過來也就是將十進制數轉化為二進制數,再從右往左獲得每一位上的值,再將這個值添加至結果值中。
public int reverseBits(int n) { //獲得最后一位的值 int mask = 1; int result = 0; for(int i=0 ; i<32 ; i++){ result <<= 1; result |= (n & mask); n >>= 1; } return result; }思路二:多次計算的話利用緩存提高銷量
為了將比特位逆轉,意味著我們至少需要32次循環才能將整個遍歷完成。那么如果這個逆轉比特位方法會被調用多次的話,我們可以使用一個Map來緩存已經遍歷過的情況。
但是,32位的重復值往往很少,因此我們可以將整數分解為多個片段存入緩存中,只要遇到重復的片段,就可以將已經得到的結果返回給調用方。根據分治思想,逆轉32個比特位等價于分別將每8個比特位進行逆轉。因此我們可以將長度為32的unsigned int拆解成4個長度為8的byte。每8個byte對應的值可以作為片段存在緩存中,只要遇到重復的片段,就可以直接返回。
Mapcache = new HashMap (); public int reverseBits2(int n){ byte[] bytes = new byte[4]; for(int i = 0 ; i<4 ; i++){ // 獲得8位并轉換為1個byte bytes[i] = (byte) ((n>>>(i*8)) & 0xff); } int result = 0; for(int i = 0 ; i<4 ; i++){ result += reverseByte(bytes[i]); if(i<3) result<<=8; } return result; } public int reverseByte(byte b){ Integer value = cache.get(b); if(value != null) return value; value = 0; for(int i = 0 ; i<8 ; i++){ value += ((b>>>i) & 1); if(i<7) value <<= 1; } cache.put(b, value); return value; }
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注我的微信公眾號!將會不定期的發放福利哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70860.html
摘要:思路一比特位移動將比特位逆轉過來也就是將十進制數轉化為二進制數,再從右往左獲得每一位上的值,再將這個值添加至結果值中。根據分治思想,逆轉個比特位等價于分別將每個比特位進行逆轉。 題目要求 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in...
摘要:自己沒事刷的一些的題目,若有更好的解法,希望能夠一起探討項目地址 自己沒事刷的一些LeetCode的題目,若有更好的解法,希望能夠一起探討 Number Problem Solution Difficulty 204 Count Primes JavaScript Easy 202 Happy Number JavaScript Easy 190 Reverse Bi...
摘要:在線網站地址我的微信公眾號完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個題。這是項目地址歡迎一起交流學習。 這篇文章記錄我練習的 LeetCode 題目,語言 JavaScript。 在線網站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號: showImg(htt...
摘要:微信公眾號記錄截圖記錄截圖目前關于這塊算法與數據結構的安排前。已攻略返回目錄目前已攻略篇文章。會根據題解以及留言內容,進行補充,并添加上提供題解的小伙伴的昵稱和地址。本許可協議授權之外的使用權限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...
摘要:移位法復雜度時間空間思路最簡單的做法,原數不斷右移取出最低位,賦給新數的最低位后新數再不斷左移。代碼分段相或法復雜度時間空間思路標準的源碼。更好的優化方法是將其按照分成段存儲,節省空間。 Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (r...
閱讀 1373·2021-09-13 10:25
閱讀 559·2019-08-30 15:53
閱讀 2274·2019-08-30 15:44
閱讀 2034·2019-08-29 17:20
閱讀 1599·2019-08-29 16:36
閱讀 1800·2019-08-29 14:10
閱讀 1789·2019-08-29 12:44
閱讀 1172·2019-08-23 14:13