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

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

一文帶你搞懂JavaScript中的進制與進制轉換

瀏覽:219日期:2022-06-01 10:02:11
目錄
  • 進制介紹
  • 進制轉換
    • parseInt(str, radix)
    • Number()
    • +(一元運算符)
    • Number.prototype.toString(radix)
  • 自定義轉換
    • 十進制與十六進制轉換
    • 十進制和二進制轉換

進制介紹

JavaScript 中提供的進制表示方法有四種:十進制、二進制、十六進制、八進制。

對于數值字面量,主要使用不同的前綴來區分:

  • 十進制(Decimal):取值數字 0-9;不用前綴。
  • 二進制(Binary):取值數字 01 ;前綴 0b0B
  • 十六進制(Hexadecimal):取值數字 0-9a-f ;前綴 0x0X
  • 八進制(Octal):取值數字 0-7 ;前綴 0o0O (ES6規定)。

需要注意的是,非嚴格模式下瀏覽器支持:如果有前綴0并且后面只用到 0-7 八個數字的數值時,該數值視為八進制;但如果前綴0后面跟隨的數字中有 8或者9,則視為十進制。

嚴格模式下,如果數字加前綴0,則報錯:Uncaught SyntaxError: Decimals with leading zeros are not allowed in strict mode。

各進制的數值,如果取值數字超過給定的范圍,則會報錯:Uncaught SyntaxError: Invalid or unexpected token。

在JavaScript內部的默認情況下,二進制、十六進制、八進制字面量數值,都會自動轉為十進制進行運算。

0x22 // 34
0b111 // 7
0o33 // 27
0x22 + 0b111 // 41
0o33 + 12 // 39
(0x33).toString() // 51
(0x33).valueOf() // 51

除了十進制是Javascript默認的數字進制以外,其他三種進制方式平時使用較少,主要在處理Blob數據、字節編碼或者位運算、轉義字符等等時候才會碰到。

進制轉換

下文將主要討論進制轉換時的問題。

JavaScript 提供了原生函數,進行十進制與其他各進制之間的相互轉換。

其中,從其他進制轉換成十進制,有三種方式:parseInt()Number()+(一元運算符)。這三種方式都只能轉換整數。

從十進制轉換成其他進制,可以使用 Number.prototype.toString()。支持小數。

parseInt(str, radix)

第一個參數是需要解析的字符串;其他進制不加前綴。

第二個參數是一個進制基數,表示轉換時按什么進制來理解這個字符串,默認值10,表示轉十進制。

第二個參數如果非數字,則自動轉數字,如無法轉稱數字則忽略該參數;是數字時,必須是 2-36 的整數,超出該范圍,返回 NaN

parseInt("1111", 2) // 15
parseInt("1234", 8) // 668
parseInt("18af", 16) // 6319
parseInt("1111") // 1111

如果不傳入第二參數,則 parseInt 會默認使用十進制來解析字符串;但是,如果字符串以 0x 開頭,會被認為是十六進制數。

而其他進制的字符串,0o21(八進制)0b11(二進制) 不會以該進制基數自動轉換,而是得到 0

所以,在使用 parseInt 進行進制轉換時,為了保證運行結果的正確性和穩定性,第二個參數不能省略

parseInt("0x21") // 33
parseInt("0o21") // 0
parseInt("0b11") // 0
parseInt("111", "add") // 111
parseInt("111", "787") // NaN

如果需要解析的字符串中存在對于當前進制基數無效的字符,則會從最高位取有效字符進行轉換,沒有效字符則返回NaN

parseInt("88kk", 16) // 136,=== 0x88
parseInt("kk", 16) // NaN

Number()

可以把字符串轉為數字,支持其他進制的字符串,默認轉成十進制數字。

字符串中如果存在無效的進制字符時,返回 NaN

記住,需要使用進制前綴,0b0o0x

Number("0b11100") // 28
Number("0o33") // 27
Number("0x33") //51

Number("0x88kk") // NaN

+(一元運算符)

Number() 一樣,可以把字符串轉為數字,支持其他進制的字符串,默認轉成十進制數字。

字符串中如果存在無效的進制字符時,返回 NaN

也需要使用進制前綴。

+"0b11100" // 28
+"0o33" // 27
+"0x33" //51

+"0x88kk" // NaN

可以看到,基本和 Number() 是一樣的,也在本質上是對數字的一種轉換處理。

Number.prototype.toString(radix)

它支持傳入一個進制基數,用于將數字轉換成對應進制的字符串,它支持轉換小數

未指定默認值為 10,基數參數的范圍 2-36,超過范圍,報錯:RangeError。

15..toString(2) // 1111
585..toString(8) // 1111
4369..toString(16) // 1111
(11.25).toString(2) // 1011.01

自定義轉換

除了這些原生函數以外,也可以自己實現進制數字之間的轉換函數。

根據相應的規則,就可以實現十進制與二進制、十六進制之間的轉換的一些方法。

十進制與十六進制轉換

以下代碼是針對整數在十進制與十六進制之間的轉換,根據基本規則進行換算。

十六進制是以 0-9a-f 進行描述數字的一種方式,其中 0-9 取本身數字的值,而 a-f 則取 10-15 的值。

且字母不區分大小寫。

function int2Hex (num = 0) {
  if (num === 0) {
    return "0"
  }
  const HEXS = "0123456789abcdef"
  let hex
  while (num) {
    hex = HEXS.charAt(num % 16) + hex
    num = Math.floor(num / 16)
  }
  return hex
}
function hex2Int (hex = "") {
  if (typeof hex !== "string" || hex === "") {
    return NaN
  }
  const hexs = [...hex.toLowerCase()]
  let resInt = 0
  for (let i = 0; i < hexs.length; i++) {
    const hv = hexs[i]
    let num = hv.charCodeAt() < 58 ? +hv : ((code - 97) + 10)
    resInt = resInt * 16 + num
  }
  return resInt
}

如果要轉換八進制,實際上與十六進制很類似,只需根據八進制的數值范圍進行部分改動即可。

八進制一般使用非常少,不單獨列出。

下面將重點介紹二進制轉換的相關知識,包括小數的二進制表示與轉換。

十進制和二進制轉換

在十進制與二進制的轉換中,我們將考慮小數,理解小數是如何在這兩者之間進行轉換。

先選定一個數字,比如:11.125 ,我們看下該數字在二進制里的表示:

(11.125).toString(2) // 1011.001

可以看到,11.125 的二進制表示為:1011.001。下面將以這個數字為例進行轉換操作。

十進制數字轉換成二進制

首先需要了解的是,二進制小數的表示方法是如何得來的:

整數 部分,用二進制表示可以如此計算,數字 11

11 / 2 ———— 1
5 / 2 ———— 1
2 / 2 ———— 0
1 / 2 ———— 1

整數部分的規則,得到的結果是 從下往上,倒著排 1011 就是二進制的 11

小數 用二進制表示可以如此計算,小數 0.125

0.125 × 2 = 0.25 ———— 0
0.25 × 2 = 0.5 ———— 0
0.5 × 2 = 1 ———— 1

只有等于1時才結束,如果結果不等于1將會一直循環下去。小數部分的規則,得到的結果是 從上往下,順著排 0.001 就是二進制的 0.125

整數 + 小數,所以 11.125 的二進制表示方式:1011.001

根據以上整數和小數分開計算的規則,就可以得到一個十進制轉二進制的函數,如下:

function c10to2 (num) {
  // 整數
  const numInteger = Math.floor(num)
  // 小數
  const numDecimal = num - numInteger

  let integers = []
  if (numInteger === 0) {
    integers = ["0"]
  } else {
    let integerVal = numInteger
    while(integerVal !== 1) {
      integers.push(integerVal % 2 === 0 ? "0" : "1")
      integerVal = Math.floor(integerVal / 2)
    }
    integers.push("1")
  }
  const resInteger = integers.reverse().join("")

  let decimals = []
  if (numDecimal) {
    let decimalVal = numDecimal
    // 最多取49位的長度
    let count = 49
    while (decimalVal !== 1 && count > 0) {
      decimalVal = decimalVal * 2
      if (decimalVal >= 1) {
decimals.push("1")
if (decimalVal > 1) {
  decimalVal = decimalVal - 1
}
      } else {
decimals.push("0")
      }
      count--
    }
  }
  const resDecimal = decimals.join("")

  return resInteger + (resDecimal ? ("." + resDecimal) : "")
}

小數在轉換成二進制時,會存在無限循環的問題,上面的代碼里截取了前49個值。

所以,這里就會引出了一個問題,就是常見的一個數字精度問題:0.1 + 0.2 != 0.3

0.1+ 0.2 != 0.3

直接看一下 0.1 轉二進制:

0.1 × 2 = 0.2
0.2 × 2 = 0.4
0.4 × 2 = 0.8
0.8 × 2 = 1.6
0.6 × 2 = 1.2
0.2 × 2 = 0.4 // 循環開始
0.4 × 2 = 0.8
0.8 × 2 = 1.6
0.6 × 2 = 1.2
...
...

無限循環

0.2 轉二進制:

0.2 × 2 = 0.4
0.4 × 2 = 0.8
0.8 × 2 = 1.6
0.6 × 2 = 1.2
0.2 × 2 = 0.4 // 循環開始
0.4 × 2 = 0.8
0.8 × 2 = 1.6
0.6 × 2 = 1.2
...
... 無限循環

因為無法得到1,可以發現有限十進制小數, 0.1 轉換成了無限二進制小數 0.00011001100...0.2 轉成了 0.001100110011...

由于無限循環,必然會導致精度丟失,正好 0.1 + 0.2 計算得到的數字在丟失精度后的最后一位不為0,所以導致結果為:0.30000000000000004

如果截取精度后最后一位為0,那自然就不存在結果不相等的情況,如 0.1 + 0.6 === 0.7,事實上,0.1和0.6轉二進制后都會丟失精度,但截取到的數值都是0,所以相等。

同樣不相等的還設有 0.1 + 0.7 !== 0.8等等。

所以是計算時轉二進制的精度丟失,才導致的 0.1 + 0.2 !== 0.3

在 JavaScript 中所有數值都以 IEEE-754 標準的 64 bit 雙精度浮點數進行存儲的。 IEEE 754 標準的 64 位雙精度浮點數的小數部分最多支持53位二進制位。 因浮點數小數位的限制而需要先截斷二進制數字,再轉換為十進制,所以在進行算術計算時會產生誤差。

這里能看到,如果十進制小數要被轉化為有限二進制小數,那么它計算后的小數第一位數必然要是 5 結尾才行(因為只有 0.5 × 2 才能變為整數)。

二進制數字轉換成十進制

方法是:將二進制分成整數和小數兩部分,分別進行轉換,然后再組合成結果的十進制數值。

整數部分:這里直接使用 parseInt 函數,parseInt('1011', 2) => 11

小數部分:如 1011.001 的小數位 001,使用下表的計算方式。

小數部分001基數的位數次冪2^-12^-22^-3每位與基數乘積0 × (2^-1)0 × (2^-2)1×(2^-3)每位乘積結果000.125

最后的結果是每位乘積結果相加:0 + 0 + 0.125 = 0.125

整數與小數合起來,就得到了 1011.001 的十進制數字:11.125

根據規則,代碼實現如下所示:

function c2To10 (binaryStr = "") {
  if (typeof binaryStr !== "string" || binaryStr === "") {
    return NaN
  }
  const [ binIntStr, binDecStr ] = binaryStr.split(".")
  let binDecimal = 0
  if (binDecStr) {
    binDecimal = [...binDecStr].reduce((res, val, index) => {
      res += Number(val) * (2 ** (-(index + 1)))
      return res
    }, 0)
  }
  return parseInt(binIntStr, 2) + binDecimal
}

到此這篇關于一文帶你搞懂JavaScript中的進制與進制轉換的文章就介紹到這了,更多相關JavaScript進制轉換內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
超碰超碰人人人人精品| 国产精品久一| 国产伦一区二区三区| 一区二区国产在线观看| 免费视频一区三区| 91精品久久久久久久久久不卡| 97视频热人人精品免费| 精品一区二区三区视频在线播放| 国产精品3区| 精品视频自拍| 久久久人人人| 男人操女人的视频在线观看欧美| 国产亚洲网站| 青青国产精品| 国产精品一页| 麻豆精品在线视频| 久久99蜜桃| 欧美13videosex性极品| 99视频精品视频高清免费| 欧美日韩免费观看一区=区三区 | 激情欧美国产欧美| 亚洲一区成人| 国产精品高潮呻吟久久久久| 久久永久免费| 1024精品久久久久久久久| 综合五月婷婷| 欧美国产一级| 国产精品视频一区二区三区综合| 91欧美国产| 激情婷婷综合| 国产欧美日韩精品高清二区综合区| 国产精品1区在线| 精品视频网站| 国产偷自视频区视频一区二区| 久久精品97| 亚洲国产日韩欧美在线| 国产精品激情电影| 免费久久久久久久久| 欧美特黄一区| 2023国产精品久久久精品双| 久久福利毛片| 在线天堂资源www在线污| 丝袜美腿亚洲色图| 日韩中文欧美| 国产精品宾馆| 日韩精品一二区| 日韩精品电影| 国户精品久久久久久久久久久不卡| 久久国产99| 国精品产品一区| 日韩av一级片| 久久性天堂网| 91精品一区二区三区综合在线爱| 国产亚洲电影| 亚洲aⅴ网站| 在线午夜精品| 欧美一级专区| 欧美在线91| 免费黄网站欧美| 亚洲男女av一区二区| 婷婷综合六月| 国产一二在线播放| 亚洲精品裸体| 老鸭窝毛片一区二区三区| 九一国产精品| av一区二区高清| 午夜免费一区| 久久不射网站| 蜜桃久久av一区| 日韩精品一区二区三区免费视频| 亚洲主播在线| 亚洲aa在线| 国产精品日本一区二区三区在线| 亚州国产精品| 日韩av网站在线观看| 国产欧美日韩免费观看| 你懂的网址国产 欧美| 日本成人中文字幕| 91欧美日韩在线| 国产精品一线| 色爱综合网欧美| 日韩精品水蜜桃| 久久不射中文字幕| 欧美综合精品| 精精国产xxxx视频在线野外| 亚洲一级网站| 亚洲精品韩国| 国产精品www.| 婷婷成人在线| 日韩va欧美va亚洲va久久| 精品美女视频| 激情五月综合网| 三级在线观看一区二区| 日韩激情精品| 日韩精品午夜| 欧美一级一区| 99久久亚洲精品| 日韩av不卡在线观看| аⅴ资源天堂资源库在线| 亚洲一区国产一区| 美女精品久久| 丝袜美腿一区二区三区| 免费日韩一区二区三区| 国产一区二区高清| 国内精品麻豆美女在线播放视频| 欧美在线网站| 日韩1区2区| 丝袜美腿亚洲一区二区图片| 国产精品对白| 亚洲人成网站在线在线观看| 播放一区二区| 久久精品女人| 亚洲欧美网站在线观看| 久久精品观看| 欧美成人精品午夜一区二区| 石原莉奈一区二区三区在线观看| 樱桃视频成人在线观看| 青青草伊人久久| 天堂av在线一区| 亚洲性图久久| 日韩一区欧美| av中文字幕在线观看第一页| 日韩一区二区久久| 日韩国产网站| 成人片免费看| 都市激情国产精品| 麻豆精品视频在线观看视频| 97久久亚洲| 日精品一区二区三区| 免播放器亚洲| 欧美专区18| 国产精品毛片在线| 不卡中文一二三区| 99精品视频在线| 精品淫伦v久久水蜜桃| 国产精选久久| 国产精品久久久久毛片大屁完整版| 亚洲欧美高清| 亚洲狼人精品一区二区三区| 男人的天堂久久精品| 日韩精品三区四区| 青草国产精品| 国产精品久久免费视频| 欧美精品二区| 日韩伦理福利| 国产精品普通话对白| 亚洲一区有码| 久久激情五月婷婷| 国产a亚洲精品| 欧美日韩国产一区精品一区| 亚洲欧美日本国产| 麻豆一区二区99久久久久| 成人日韩av| 欧美 日韩 国产精品免费观看| 精品视频国产| 国产一区国产二区国产三区| 国产传媒在线| 日韩午夜高潮| 国产精品一区高清| 午夜影院一区| 亚洲另类黄色| 国产乱码午夜在线视频| 先锋亚洲精品| 国产精品v日韩精品v欧美精品网站| 黄色国产精品| 午夜在线播放视频欧美| 国产精品一区2区3区| 亚洲性色av| 国产亚洲一级| 久久精品免视看国产成人| 制服诱惑一区二区| 精品视频亚洲| 中文字幕亚洲影视| 亚洲欧洲美洲av| 国产日产一区| 黑丝一区二区| 综合日韩av| 国产精品久久亚洲不卡| 亚洲一区二区成人| 欧美午夜三级| 国产亚洲高清视频| 欧美香蕉视频| 国产日韩免费| 黄色日韩在线| 欧美一区三区| 麻豆视频在线观看免费网站黄 | 久久在线免费| 日韩av二区| 美女精品视频在线| 18国产精品| 青青国产91久久久久久| 久热精品在线| 久久伦理在线| 蜜臀av一区二区在线免费观看| 免费在线成人网| 精品国产欧美日韩一区二区三区| 日本不卡高清视频| 午夜在线视频观看日韩17c| 91综合网人人| 136国产福利精品导航网址|