業務需求是這樣的,通過小程序連接藍牙,連接之后通過指令進行通訊。有個溫度設置的功能,輸入設定的溫度,發送給接藍牙。
藍牙接收到並識別,返回一個當前溫度值。關鍵就是這個溫度值,底層規定的有符號位的十六進制數,兩位十六進制,轉為二進制也就是有8位二進制,也就是-127~127;
負數的補碼怎么表示?
為了方便底層的識別和運算,二進制使用補碼,我們知道 正數的補碼是它本身,而負數的補碼則是反碼的基礎上加1,例如-8這個數,轉為二進制10001000,反碼11110111,補碼則等於反碼加1為11111000;最后由補碼轉為十六進制HEX。
也就是,非符號位部分,即原碼的絕對值-1的反碼會得到補碼。這樣做的好處是一次性將十進制值算好,再轉二進制取反,畢近js的運算都是基於十進制的。
//拿四位二進制舉例 1110 -6 //原碼 1010 (1001 + 1)//補碼 //另一角度來講 用5的反碼 符號位補1即 0101 -> 0010 -> 1010
js代碼這么寫
//十進制轉二進制補碼 tenToTwo(n){ // write code here //-123的二進制表示為-1111011,123的為1111011,因此首先要得到負數二進制的補碼表示 //其后面部分的補碼0000101 = 122的正碼1111011按位取反, //這個正碼加上前面的0即是再全部按位取反即得-123的補碼表示 if(n < 0) { n = -n; n = n - 1; var str = (Array(8).join("0") + n.toString(2)).slice(-8); str = this.exchange(str); }else{ var str = (Array(8).join("0") + n.toString(2)).slice(-8); } return str; }, //如果是負數,0變1,1變0 原碼轉反碼 exchange(str) { var arr = str.split(''); for (var i = 0; i < arr.length; i++) { if (arr[i] == 0) { arr[i] = 1; } else { arr[i] = 0; } } str = arr.join(""); return str; }
二進制轉換完成之后,再轉為設備可以識別的HEX
//二進制轉16進制 bin_to_hex(str) { let hex_array = [{ key: 0, val: "0000" }, { key: 1, val: "0001" }, { key: 2, val: "0010" }, { key: 3, val: "0011" }, { key: 4, val: "0100" }, { key: 5, val: "0101" }, { key: 6, val: "0110" }, { key: 7, val: "0111" }, { key: 8, val: "1000" }, { key: 9, val: "1001" }, { key: 'a', val: "1010" }, { key: 'b', val: "1011" }, { key: 'c', val: "1100" }, { key: 'd', val: "1101" }, { key: 'e', val: "1110" }, { key: 'f', val: "1111" }] let value = '' let list = [] if(str.length% 4 !== 0){ let a = "0000" let b = a.substring(0, 4 - str.length % 4) str = b.concat(str) } while (str.length > 4) { list.push(str.substring(0, 4)) str = str.substring(4); } list.push(str) for (let i = 0; i < list.length; i++) { for (let j = 0; j < hex_array.length; j++) { if (list[i] == hex_array[j].val) { value = value.concat(hex_array[j].key) break } } } return value },
