摘要:之前在某個項目中,遇到了許多的二進(jìn)制操作場景,因此總結(jié)下中的二進(jìn)制操作方法。有符號右移將的二進(jìn)制表示向右移位,丟棄被移出的位。用來表示原始的二進(jìn)制數(shù)據(jù)緩存區(qū),但是不可直接對進(jìn)行操作,需要借助或者類型數(shù)組對象來對緩存區(qū)的內(nèi)容進(jìn)行讀寫。
之前在某個項目中,遇到了許多JS的二進(jìn)制操作場景,因此總結(jié)下JS中的二進(jìn)制操作方法。
所謂二進(jìn)制操作,是指操作變量實際存儲的值,比如獲取字符A的Unicode值,或者將值100填入到8個字節(jié)中。
1. 位操作符JS中的位操作與很多語言類似,具體的位運算符如下表所示。
運算符 | 用法 | 描述 |
---|---|---|
按位與 | a & b | 對于每一個比特位,只有兩個操作數(shù)相應(yīng)的比特位都是1時,結(jié)果才為1,否則為0。 |
按位或 | a | b | 對于每一個比特位,當(dāng)兩個操作數(shù)相應(yīng)的比特位至少有一個1時,結(jié)果為1,否則為0。 |
按位異或 | a ^ b | 對于每一個比特位,當(dāng)兩個操作數(shù)相應(yīng)的比特位有且只有一個1時,結(jié)果為1,否則為0。 |
按位非 | ~ a | 反轉(zhuǎn)操作數(shù)的比特位,即0變成1,1變成0。 |
左移 | a << b | 將 a 的二進(jìn)制形式向左移 b (< 32) 比特位,右邊用0填充。 |
有符號右移 | a >> b | 將 a 的二進(jìn)制表示向右移 b (< 32) 位,丟棄被移出的位。 |
無符號右移 | a >>> b | 將 a 的二進(jìn)制表示向右移 b (< 32) 位,丟棄被移出的位,并使用 0 在左側(cè)填充。 |
在介紹具體的方法前,我們需要先了解下UCS-2和UTF-16編碼。
UCS-2是一個16bit長度的編碼集,它的表示范圍是0到0xFFFF。UTF-16的表示范圍是0到0x10FFFF,它由1個或者2個16bit的編碼單元組成。其中UCS-2是UTF-16的子集,UTF-16編碼在0到0x00FFFF的范圍稱為BMP(基本多文種平面),BMP與UCS-2的編碼完全一致。
更詳細(xì)的說明可以參考這里。
2.1 String.fromCharCodefromCharCode 方法返回指定的UCS-2編碼對應(yīng)的字符串。它是String上的靜態(tài)方法,不可通過字符串對象直接訪問。
因為入?yún)⑹荱CS-2編碼值,所以不能多于16bit,即入?yún)⒅狄∮?5536。如果入?yún)⑿枰笥?5536,可以使用 String.fromCodePoint 。
String.fromCharCode(65) // A String.fromCharCode(65, 66, 68) // ABD2.2 String.prototype.charCodeAt
charCodeAt 返回字符串指定位置的字符的UTF-16編碼。該方法可以直接從字符串對象進(jìn)行調(diào)用。
如果該字符不能使用一個UTF-16編碼單元(16bit)來表示時,該方法只會返回第一個編碼單元。如果需要獲取完整的編碼,可以使用 String.prototype.codePointAt 。
"AB".charCodeAt(0) // 65 "AB".charCodeAt(1) // 663. ArrayBuffer
ArrayBuffer用來表示原始的二進(jìn)制數(shù)據(jù)緩存區(qū),但是不可直接對ArrayBuffer進(jìn)行操作,需要借助DataView或者類型數(shù)組對象來對緩存區(qū)的內(nèi)容進(jìn)行讀寫。
3.1 DataViewDataView 可以理解為數(shù)據(jù)視窗,通過 DataView 對象可以對 ArrayBuffer 進(jìn)行讀寫操作。
const buffer = new ArrayBuffer(4); // 申請2個字節(jié)長度的緩存區(qū) const view1 = new DataView(buffer); // view1的范圍是整個緩存區(qū) const view2 = new DataView(buffer, 2, 1) // view2的范圍是從第2個字節(jié)開始往后的一個字節(jié) // 向一個16bit的內(nèi)容中填入一個帶符號的數(shù) // 參數(shù)的含義依次為 輸入內(nèi)容的位置、輸入的值、是否使用小端方式(默認(rèn)大端) view1.setInt16(0, 0x0A0B, false); view1.getInt8(0); // 10,即0x0A view1.getInt8(1); // 11,即0x0B view2.setUint8(0, 255); view2.getInt8(0); // 按照有符號數(shù)來讀取,結(jié)果為-1
更多的操作方法可以參考DataView。
3.2 類型數(shù)組對象類型數(shù)組對象有很多種,比如Uint8Array, Int32Array等。將ArrayBuffer轉(zhuǎn)化為類型數(shù)組后,就可以像數(shù)組一樣來操作緩存區(qū)。
const buffer = new ArrayBuffer(8); const arr1 = new Int16Array(buffer); const arr2 = new Uint8Array(buffer); arr1[0] = 256; arr2[6] = 255; console.log(arr1); // [256, 0, 0, 255] console.log(arr2); // [0, 1, 0, 0, 0, 0, 255, 0]
參考文獻(xiàn)
按位操作符 - JavaScript | MDN
Unicode字符平面映射
JavaScript’s internal character encoding: UCS-2 or UTF-16?
String.fromCharCode() - JavaScript | MDN
String.prototype.charCodeAt() - JavaScript | MDN
ArrayBuffer - JavaScript | MDN
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101714.html
摘要:將任一數(shù)值與執(zhí)行按位與操作,其結(jié)果都為。中應(yīng)用判斷奇偶性偶數(shù)奇數(shù)按位異或規(guī)則每一位都不同,結(jié)果才為將任一數(shù)值與進(jìn)行異或操作,其結(jié)果為。 位運算在算法中很有用,速度可以比四則運算快很多。 To2orTo10 JS中十進(jìn)制轉(zhuǎn)二進(jìn)制: (val).toString(2)JS中二進(jìn)制轉(zhuǎn)十進(jìn)制: parseInt(val, 2) JS中規(guī)定安全整數(shù)的范圍是-2^53~2^53,所以大于90071...
摘要:在創(chuàng)建時大小已經(jīng)被確定且是無法調(diào)整的,在內(nèi)存分配這塊是由層面提供而不是具體后面會講解。在這里不知道你是否認(rèn)為這是很簡單的但是上面提到的一些關(guān)鍵詞二進(jìn)制流緩沖區(qū),這些又都是什么呢下面嘗試做一些簡單的介紹。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多數(shù)人都擁有自己不了解的能力和機...
摘要:原碼補碼和反碼原碼一個數(shù)在計算機中是以二進(jìn)制的形式存在的,其中第一位存放符號正數(shù)為負(fù)數(shù)為。中的位運算在中按位操作符會將其操作數(shù)轉(zhuǎn)成補碼形式的有符號位整數(shù)。原文鏈接由扯到中的位運算 這個話題的由來是2016年3月份的時候 NPM 社區(qū)發(fā)生了‘left-pad’事件,不久后社區(qū)就有人發(fā)布了用來補救的,也是現(xiàn)在大家能用到的 left-pad 庫。 最開始這個庫的代碼是這樣的。 module....
摘要:類型化數(shù)組也是中新引入的。用一句話解釋類型化數(shù)組就是它是操作二進(jìn)制數(shù)據(jù)的接口。類型化數(shù)組類型化數(shù)組的應(yīng)用二進(jìn)制數(shù)據(jù)的接口主要應(yīng)用于文件,在中涉及文件處理的幾乎都可以應(yīng)用,主要是,,。 類型化數(shù)組(Typed Array)也是HTML5中新引入的API。用一句話解釋類型化數(shù)組就是:它是JS操作二進(jìn)制數(shù)據(jù)的接口。 眾所周知,直接操作二進(jìn)制數(shù)據(jù)可以使程序更為高效, 盡管JS對常規(guī)數(shù)組做了很多...
摘要:如何讓根據(jù)拆箱轉(zhuǎn)換,以及的隱式轉(zhuǎn)換,可以如下寫為什么計算機中所有的數(shù)據(jù)都是以二進(jìn)制存儲的,所以在計算機計算時要把數(shù)據(jù)先轉(zhuǎn)換成二進(jìn)制進(jìn)行計算,然后把計算結(jié)果轉(zhuǎn)換成十進(jìn)制。會存在精度丟失問題和的二進(jìn)制都是以無線循環(huán)的小數(shù)的二進(jìn)制的二進(jìn)制 本想著記筆記里,但是筆記里沒有分類,還是以文章的形式,當(dāng)個人總結(jié)吧,這一篇就當(dāng)作JS基礎(chǔ)篇的記錄吧,有修改的和新增的持續(xù)更新~ 關(guān)于JS的一些小技巧 1:...
閱讀 2578·2021-09-06 15:02
閱讀 3207·2021-09-02 10:18
閱讀 2829·2019-08-30 15:44
閱讀 691·2019-08-30 15:43
閱讀 1956·2019-08-30 14:08
閱讀 2764·2019-08-30 13:16
閱讀 1406·2019-08-26 13:52
閱讀 936·2019-08-26 12:21