将二进制补码转换为二进制表示

时间:2019-10-10 02:42:31

标签: javascript floating-point binary numbers twos-complement

我正在做一些按位操作。

我要用| =而不是+ =将32位数字添加到另一个32位数字中,因为我认为该数字在转换为32位时可能会弄乱(二进制没有正确显示)。 / p>

基本上,我操作结束时的数字是我所执行的按位操作的二进制补码解释。我认为,我尝试退出操作的原始二进制文件在将二进制补码号转换为标准64位浮点数(操作完成时)时被踢出。在这种情况下,不再考虑二进制文件,它只是尝试获取结果(例如-5),并为此生成一个64位二进制表示。但是,-5的二进制补码位表示和标准的64位数字明显不同。

我只关心二进制文件,它最终解释为数字对我来说不是问题。

我只是想确保我的二进制文件不会被踢出去。如何在执行操作时保留二进制文件而不必弄清楚如何进入二进制字符串?

我真的不想将我的32位数字分解为8位或16位,但这是唯一的方法吗?

我仍在尝试了解javascript在执行其按位操作时到底发生了什么,因此,如果我弄清了一个重要的细节,我不会感到惊讶。

请帮助!我需要了解这里发生了什么以及如何解决。

编辑:在调试器中,经过处理后,该数字显示为我的位的二进制补码解释,这使我感到困惑,因为我认为在将值返回给任何用户代码之前,它会转换回64位数字

我真的不想提供我的代码,因为我不想深入了解为什么我要做每一个小步骤,但是从根本上讲,我有一个增量为“ ins”的整数的二进制文件“是二进制字符串的参数。 sbs是startBits的缩写,它是从左到右(左为MSB)的第一位(MSB)位置的数组。基本上,起始位是第一位占位(因此在这里或那里有些奇怪的-1或+1)从1开始的位置,而tot位是争辩者包含的位的总数。如果起始位数组(sbs)中有多个元素,则起始位的每个位中的位数就是总位除以起始位数组的长度。因此,如果起始位数组中有两个元素且tot位为4,则“ counts”值的2个MSB位将被放置在sbs [0]处,而2个LSB位将被放置在sbs [1]处。希望这已经足够清楚了。

这是我的代码:

function getHexCode(thing){
    return parseInt(thing.hexCode.slice(0,8), 16);
  }

  function constructArglessBinaryString(thing){
    return getHexCode(thing);
  }
  
  function constructBinaryStringWithArgs(thing, counts){
    var bin = []
    bin.push(constructArglessBinaryString(thing));
    bin.push(0);
    let tbs = thing.args[0].totBits;
    let sbs = thing.args[0].startBits;
    let mask = (1 << tbs/sbs.length) - 1; // make mask a continguous length of 1 bits
    let i = 0;
    do{
      let a = counts & (mask << (tbs/sbs.length * i)); // & the mask with the counts at a sequential location along the counts total bits length
      let b = a >>> (tbs/sbs.length * i); // shift the result back before incorporating into binary string
      if (sbs[i] <= 32){
        var x = (b << (32 - sbs[i] - tbs/sbs.length + 1));
        bin[0] |= (b << (32 - sbs[i] - tbs/sbs.length + 1));        // place into binary string at respective sb location
      }
        else 
        bin[1] |= (b << (32 - (sbs[i]-32) - tbs/sbs.length + 1));   // case in which the arg bits go in the second 32 bits
      i++;
    }while(i<sbs.length)
    return bin;
  }

0 个答案:

没有答案