關於「十進位制轉二進位制,求位數」的一點小結

2021-10-22 23:48:16 字數 1555 閱讀 5722

題目描述:

假設有這麼乙個函式valueatbit(num, bit),輸入乙個十進位制數num,求它的二進位制數的bit位是多少(注意bit應該從1算起)

以下是幾種實現方法的總結:

這個方法模擬了平時我們計算二進位制數的過程:

num除以2,求出得商和餘數(假設商為resu,餘數為rest)

拿上次的商resu再除以2,求得新的商resu和本輪的餘數rest

重複1、2步操作,直至商resu為0

倒序將所有的餘數rest拼接即為該十進數的二進位制表示

將上述過程實現成js**如下:

function valueatbit1(num, bit) 

return result[bit - 1]; // 這裡是應題目要求,求bit位的

}

function valueatbit2(num, bit)
tostring接收乙個引數radix(基數),表示你要把該數字物件(注意是數字物件才包含該方法,不可以是字面量)轉成幾進製的字串。

function valueatbit3(num, bit)
這個方法是跳過求二進位制數這個過程,直接求bit位的,因為移位操作只能是對二進位制進行運算,所以這裡可以直接用num,>>會隱式轉換成二進位制。

這個方法的原理是這樣的:(不過如果大家看不懂以上的語句,建議在這之前先看一下位運算的基礎知識哈)

先讓所求位向右移到第一位,這時左邊空出來的位會自動補0,先叫它「已移位的num」

讓移位操作後的這個數和1相與(1的二進位制除第一位左邊全為0),這樣相與了之後,得到的結果是除第一位之外的其他位都變為0,此時按照相與運算的運算規則:- 如果「已移位的num」第一位是0那麼相與之後是0;- 如果「已移位的num」第一位是1那麼相與之後是1。此時返回的結果便是所求。

可能我陳述得有點亂,不過大家可以親測一下,原理很巧妙哦。

function valueatbit4(num, bit)
該方法與方法三有點相似,不過這個方法不需進行移位操作,而是先生造乙個與所求位匹配的二進位制數,讓它們倆相與,如果結果為非零則返回1,結果為零則返回0

比如說要求29的二進位制數的第3位,那麼過程如下:

29 的二進位制表示為 11101(這個過程由位操作符自動轉換)

求第 3 位,那麼生造乙個二進位制數 00100(除所求位為1,其他位為0),能達到這個效果的就需要用到math.pow()這個方法了

讓1、2步的這兩個數進行位相與,結果是除所求位之外的其他位變為0,所求位如果原來是1則相與之後該位為1;,所求位如果原來是0則相與之後該位為0;(在本例中結果為 00100)

通過三元表示式判斷結果並返回:判斷第3步的結果是否為0,如果為零則返回0,如果非零則返回1(在本例中,結果00100即為十進位制的4,非零,所以返回1)

我們可以驗證一下結果,返回的1在原來的11101的第三位中確實是1,大家也可以驗證看看其他位。原理也比較巧妙哦。

其中方法三和方法四學自牛客網的巨佬們,在這裡要謝謝各位巨佬們。

同時也感謝讀者們能讀到最後,阿里嘎多~

二進位制轉十進位制

二進位制轉十進位制方法很多,如字元陣列,指標法等 下面用字串函式的方法實現 二進位制轉十進位制 主要用 到 string函式性質及pow求乙個數的n次方的函式過載 by adengou 2010.08.04 win7 dev c 5.0 vs 2010 通過 include include incl...

十進位制轉二進位制

includeint dg unsigned n,int c 注意 引數型別是unsigned int main 陣列全部初始化為0 printf d n sizeof int unsigned temp,u temp u 4294967295u int tu int u printf u u,tu...

十進位制轉二進位制

宣告 最後一種降冪法頗具魅力,而且與方法二有異曲同工之妙 十進位制轉二進位制的幾種方法 輸入 乙個無符號的十進位制整數 輸出 對應十進位制的二進位制顯示 例如 input 10,output 1010 方法一 除二取餘法 forinput 0 cout input 2 input 2 end 輸出順...