一次JavaScript 實現原碼與補碼相互轉換


業務需求是這樣的,通過小程序連接藍牙,連接之后通過指令進行通訊。有個溫度設置的功能,輸入設定的溫度,發送給接藍牙。

藍牙接收到並識別,返回一個當前溫度值。關鍵就是這個溫度值,底層規定的有符號位的十六進制數,兩位十六進制,轉為二進制也就是有8位二進制,也就是-127~127;

負數的補碼怎么表示?

為了方便底層的識別和運算,二進制使用補碼,我們知道 正數的補碼是它本身,而負數的補碼則是反碼的基礎上加1,例如-8這個數,轉為二進制10001000,反碼11110111,補碼則等於反碼加1為11111000;最后由補碼轉為十六進制HEX。

也就是,非符號位部分,即原碼的絕對值-1的反碼會得到補碼。這樣做的好處是一次性將十進制值算好,再轉二進制取反,畢近js的運算都是基於十進制的。

//拿四位二進制舉例
1110 -6  //原碼
10101001 + 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
  },

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM