日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript常用進制轉換及位運算實例解析

瀏覽:320日期:2023-10-11 14:19:58

前言

在一般的代碼中很少會接觸到進制和位運算,但這不代表我們可以不去學習它。作為一位編程人員,這些都是基礎知識。如果你沒有學過這方面的知識,也不要慌,接下來的知識并不會很難。本文你將會學習到:

進制轉換 按位操作符 JavaScript進制轉換 手動實現進制轉換

進制轉換

以下使用常見的十進制和二進制轉換作為例子,其他進制的轉換也是大同小異,感興趣可以自己琢磨下。

十進制轉二進制

根據 “逢十進一” 的法則進行計數時,每十個相同的單位組成一個和它相鄰的較高的單位,這種計數法叫做十進制計數法,簡稱十進制。這種是我們最常用的計數法。

整數

整數使用 “除二取余,逆序排列” 來轉換為二進制,下面是18轉換為二進制的例子:

// 除二取余18 / 2 = 9...09 / 2 = 4...14 / 2 = 2...02 / 2 = 1...01 / 2 = 0...1

// 倒序排列10010

就這么簡單,將得出的余數逆序排列,即可得出18的二進制表示

小數

小數使用的是 “乘二取整,順序排列”,由于方法不同需要分開計算。下面是16.125轉為二進制的例子:

16 / 2 = 8...08 / 2 = 4...04 / 2 = 2...02 / 2 = 1...01 / 2 = 0...1

0.125 * 2 = 0.250.25 * 2 = 0.50.5 * 2 = 1

10000.001

將小數相乘的結果,取結果的整數順序排列,得出小數位的二進制表示

二進制轉十進制

根據 “逢二進一 ” 的法則進行計數時,每兩個相同的單位組成一個和它相鄰的較高的單位,這種計數法叫做二進制計數 法,簡稱二進制。用二進制計數時,只需用兩個獨立的符號“0”和“1” 來表示。

整數

整數使用 “按權相加” 法,即二進制數首先寫成加權系數展開式,然后按十進制加法規則求和。下面是101010轉換位十進制的例子:

2^5 2^4 2^3 2^2 2^1 2^0 1 0 1 0 1 0------------------------32 + 0 + 8 + 0 + 2 + 0 = 42

上面從右數依次是2的0次方,2的1次方,2的2次方... , 只取位數為1的結果,將它們相加就可以得到十進制。

小數

10110.11轉十進制:

2^4 2^3 2^2 2^1 2^0 2^-1 2^-21 0 1 1 0 . 1 1-------------------------------16 + 0 + 4 + 2 + 0 + 0.5 + 0.25 = 22.75

按位操作符

按位操作符(Bitwise operators) 將其操作數(operands)當作32位的比特序列(由0和1組成),前 31 位表示整數的數值,第 32 位表示整數的符號,0 表示正數,1 表示負數。例如,十進制數18,用二進制表示則為10010。按位操作符操作數字的二進制形式,但是返回值依然是標準的JavaScript數值。

按位與( AND)

對于每一個比特位,只有兩個操作數相應的比特位都是1時,結果才為1,否則為0。用法: a & b 。

9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)--------------------------------14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10)

在判斷一個數字奇偶時,可以使用 a & 1

function assert(n) {return n & 1 ? '奇數' : '偶數'}assert(3) // 奇數

因為奇數的二進制最后一位是1,而1的二進制最后一位也是1,通過 & 操作符得出結果為1

按位或(OR)

對于每一個比特位,當兩個操作數相應的比特位至少有一個1時,結果為1,否則為0。用法: a | b

9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)--------------------------------14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10)

將浮點數向下取整轉為整數,可以使用 a | 0

12.1 | 0 // 1212.9 | 0 // 12

按位異或(XOR)

對于每一個比特位,當兩個操作數相應的比特位有且只有一個1時,結果為1,否則為0。用法: a ^ b

9 (base 10) = 00000000000000000000000000001001 (base 2)14 (base 10) = 00000000000000000000000000001110 (base 2)--------------------------------14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10)

按位非(NOT)

反轉操作數的比特位,即0變成1,1變成0。

用法: ~ a

9 (base 10) = 00000000000000000000000000001001 (base 2)--------------------------------~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10)

通過兩次反轉操作,可將浮點數向下取整轉為整數

~~16.125 // 16~~16.725 // 16

左移(Left shift)

將 a 的二進制形式向左移 b (< 32) 比特位,右邊用0填充。用法: a << b

9 (base 10): 00000000000000000000000000001001 (base 2)--------------------------------9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)

左移一位相當于在原數字基礎上乘2,利用這一特點,實現2的n次方:

function power(n) {return 1 << n}power(3) // 8

有符號右移

將 a 的二進制表示向右移 b (< 32) 位,丟棄被移出的位。

用法: a >> b

9 (base 10): 00000000000000000000000000001001 (base 2)--------------------------------9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

相比之下, -9 >> 2 得到 -3,因為符號被保留了。

-9 (base 10): 11111111111111111111111111110111 (base 2)---------------------------------9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)

與左移相反,右移一位在原數字基礎上除以2

64 >> 1 // 32

無符號右移

將 a 的二進制表示向右移 b (< 32) 位,丟棄被移出的位,并使用 0 在左側填充。

用法: a >>> b

在非負數來說, 9 >>>2 和 9 >> 2 都是一樣的結果

9 (base 10): 00000000000000000000000000001001 (base 2)--------------------------------9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

而對于負數來說,結果就大有不同了,因為 >>> 不保留符號,當負數無符號右移時,會使用0填充

-9 (base 10): 11111111111111111111111111110111 (base 2)---------------------------------9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)

可以使用無符號右移來判斷一個數的正負

function isPos(n) { return (n === (n >>> 0)) ? true : false;}isPos(-1); // falseisPos(1); // true

雖然 -1 >>> 0 不會發生右移,但 -1 的二進制碼已經變成了正數的二進制碼, -1 >>> 0 結果為4294967295

Javascript進制轉換

toString

toString 常用于將一個變量轉為字符串,或是判斷一個變量的類型,例如:

let arr = []Object.prototype.toString.call(arr) // [object Array]

你應該沒想過 toString 可以用于進制轉換,請看下面例子:

(18).toString(2) // 10010(base 2)(18).toString(8) // 22 (base 8)(18).toString(16) // 12 (base 16)

參數規定表示數字的基數,是 2 ~ 36 之間的整數,若省略該參數,則使用基數 10。該參數可以理解為轉換后的進制表示。

parseInt

parseInt 常用于數字取整,它同樣可以傳入參數用于進制轉換,請看下面例子:

parseInt(10010, 2) // 18 (base 10)parseInt(22, 8) // 18 (base 10)parseInt(12, 16) // 18 (base 10)

第二個參數表示要解析的數字的基數,該值介于 2 ~ 36 之間。如果省略該參數或其值為 0,則數字將以 10 為基礎來解析。如果該參數小于 2 或者大于 36,則 parseInt 將返回 NaN。

記得有道面試題是這樣的:

// 問:返回的結果[1, 2, 3].map(paseInt)

接下來,我們來一步一步的看下過程發生了什么?

parseInt(1, 0) // 基數為 0 時,以 10 為基數進行解析,結果為 1parseInt(2, 1) // 基數不符合 2 ~ 36 的范圍,結果為 NaNparseInt(3, 2) // 這里以 2 為基數進行解析,但 3 很明顯不是一個二進制表示,故結果為 NaN

//題目結果為[1, NaN, NaN]

手動實現進制轉換

雖然 JavaScript 為我們內置了進制轉換的函數,但手動實現進制轉換有利于我們理解過程,提高邏輯能力。對于初學者來說也是一個很不錯的練習例子。以下只簡單實現非負整數的轉換。

十進制轉二進制

基于 “除二取余” 思路實現

function toBinary(value) { if (isNaN(Number(value))) { throw `${value} is not a number` } let bits = [] while (value >= 1) { bits.unshift(value % 2) value = Math.floor(value / 2) } return bits.join(’’)}

使用

toBinary(36) // 100100toBinary(12) // 1100

二進制轉十進制

基于 “取冪相加” 思路實現

function toDecimal(value) { let bits = value.toString().split(’’) let res = 0 while (bits.length) { let bit = bits.shift() if (bit == 1) { // ** 為冪運算符,如:2**3 為 8 res += 2 ** bits.length } } return res}

使用

toDecimal(10011) // 19toDecimal(11111) // 33

寫在最后

本文為大家介紹了進制和位運算的相關知識,旨在溫故知新。我們只需要大概了解就好,因為在開發中真的用得少,至少我只用過 ~~ 來取整。而類似于~~這種取整操作還是盡量少用為好,對于其他開發者來說,可能會影響到代碼可讀性。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
999国产精品永久免费视频app| 天堂成人国产精品一区| 97成人在线| 欧美精品自拍| 日本成人在线视频网站| 国产精品免费精品自在线观看| 久久精品国产亚洲aⅴ| 97精品国产| 国产精品三级| 欧美日韩伊人| 亚洲精品a级片| 播放一区二区| 亚洲韩日在线| 一区在线观看| 亚洲丝袜啪啪| 国产精品一区二区精品视频观看| 国产欧美一区二区色老头| 欧美日本不卡高清| 国产午夜精品一区在线观看| 国产精品免费不| 久久久久久一区二区| 国产成人精品亚洲日本在线观看| 久久亚洲国产| 亚洲一区二区三区高清不卡| 日韩综合小视频| 麻豆久久久久久| 成人国产精品一区二区网站| 欧美日韩一二三四| 亚洲香蕉久久| 美女av一区| 日韩欧美三级| 中文一区二区| 国产精品嫩模av在线| 欧美xxxx中国| 一本一道久久a久久精品蜜桃| 免费看欧美美女黄的网站| 日韩一区二区三区在线看| 欧美日韩一区二区国产| 黄色aa久久| 黄色成人91| 91亚洲精品在看在线观看高清| 国产精品一卡| 欧美国产美女| 亚洲一区二区免费看| 国产乱人伦精品一区| 色婷婷综合网| 综合亚洲色图| 成人福利视频| 蜜臀国产一区二区三区在线播放| 国产精品115| 亚洲国产专区| 国产日韩欧美一区在线| 日本免费一区二区三区四区| 99视频精品| 国产精品22p| 午夜电影亚洲| 日韩av电影一区| 日本精品不卡| 国产一精品一av一免费爽爽| 久久精品亚洲人成影院| 久久国产三级精品| 好看的av在线不卡观看| 久久精品国产免费| 免费观看久久久4p| 日韩精品第一区| 青青国产精品| 婷婷成人基地| 国产suv精品一区| 午夜亚洲福利| 亚洲一级影院| 精品视频在线一区二区在线| 国产视频一区三区| 日韩深夜视频| 国产精品入口久久| 丝瓜av网站精品一区二区| 欧美日韩国产观看视频| 日韩1区2区日韩1区2区| 99xxxx成人网| 亚洲va在线| 久久天堂影院| 国产午夜久久av| 免费不卡在线视频| 久久国产中文字幕| 成人一区而且| 国产精品亚洲人成在99www| 99在线观看免费视频精品观看| 欧美日韩午夜| 亚洲精品黄色| 国产视频亚洲| 精品一区欧美| 九九精品调教| 国精品产品一区| 欧美日韩亚洲一区| 亚洲69av| 免费精品视频在线| 亚洲欧美不卡| 亚洲精品99| 精品在线91| 久久久夜夜夜| 日韩免费视频| 不卡福利视频| 国产91在线精品| 麻豆国产欧美一区二区三区| 欧美日本一区| 国产亚洲久久| 欧美一级一区| 啪啪亚洲精品| 日本综合精品一区| 亚洲啊v在线免费视频| 免费在线观看日韩欧美| 欧美日韩国产综合网| 99久久久久国产精品| 日韩电影免费网址| 国产suv精品一区二区四区视频| 国产乱子精品一区二区在线观看| 日韩av资源网| 亚洲理论在线| 日韩专区在线视频| 日韩中文字幕一区二区三区| 亚洲作爱视频| 视频一区欧美精品| 少妇精品久久久一区二区三区| 日韩综合一区二区三区| 日韩一区二区三免费高清在线观看| 亚洲视频国产精品| 亚洲三级精品| 日本成人中文字幕在线视频| 日韩精品欧美精品| 国产日韩1区| 欧美国产日韩电影| 精品视频一区二区三区在线观看 | 香蕉成人久久| 亚洲在线成人| 一区二区三区午夜视频| 天堂精品久久久久| 欧美激情91| 五月天av在线| 婷婷综合社区| 丝袜亚洲精品中文字幕一区| 免费成人av在线播放| 综合干狼人综合首页| 日韩高清在线观看一区二区| 国产伦精品一区二区三区在线播放| 欧美1区2区3| av资源新版天堂在线| 色婷婷久久久| 性欧美精品高清| 日本成人中文字幕在线视频| 国产精品地址| 天堂√8在线中文| 在线看片不卡| 日本中文字幕一区二区| 欧美精品97| 日韩一区二区中文| 蜜桃视频欧美| 日韩av电影一区| 久久青青视频| 亚洲欧美日韩精品一区二区| 日本成人在线不卡视频| 国产成人久久精品麻豆二区| 日韩中文首页| 亚洲伊人精品酒店| 国内精品伊人| 黄色日韩精品| 国产欧美自拍| 国产99亚洲| 日韩激情综合| 欧美精品高清| 亚洲深深色噜噜狠狠爱网站| 欧美片第1页综合| 中文在线中文资源| 国产精品婷婷| 国产精品欧美大片| av亚洲在线观看| 国产欧美三级| 激情久久中文字幕| 青青草伊人久久| 日韩在线欧美| 日韩激情视频网站| 精精国产xxxx视频在线野外| 亚洲精品伊人| 日韩一区亚洲二区| 日韩在线视频一区二区三区| 日本精品黄色| 99riav1国产精品视频| 国产精品免费99久久久| 欧美aa国产视频| 国产欧美日韩在线一区二区| 色婷婷久久久| 国产精品免费99久久久| 91超碰国产精品| 久久伊人国产| 亚洲精品少妇| 99精品视频在线| 国产精品极品在线观看| 亚洲免费高清| 黄色在线网站噜噜噜| 天堂va在线高清一区| 99视频精品视频高清免费| 91福利精品在线观看|