Преобразование числа с дополнением Twos в его двоичное представление - PullRequest
1 голос
/ 10 октября 2019

Я делаю некоторые побитовые манипуляции.

Я добавляю 32-разрядное число к другому 32-разрядному числу с помощью | = вместо + =, потому что я думал, что число может быть испорчено, когда оно преобразуется в32-разрядный (двоичный код не отображается правильно).

По сути, число в конце моих операций - это дополнительная интерпретация двоих данных для побитовой манипуляции, которую я выполнил. Я думаю, что исходный двоичный файл, который я пытался вывести из своих операций, вылетает, когда он берет число дополнения к этим двум и преобразует его в стандартный 64-разрядный код с плавающей запятой (когда операция завершена). Например, двоичный файл перестает рассматриваться, и он просто пытается взять результат, скажем -5, и создать для него 64-битное двоичное представление. Но битовое представление -5 в дополнение к двум и стандартное 64-битное число, очевидно, совершенно иное.

Мне важен только двоичный код, число, которое он интерпретирует, как не проблема для меня вконец дня.

Я просто хочу быть уверен, что мой двоичный файл не будет выгнан. Как я могу сохранить свой двоичный файл в моих операциях, не разбивая, как я вступаю в свою двоичную строку?

Я действительно не хочу разбивать свои 32-битные числа на 8-битные или 16-битные, но разве это единственный способ?

Я все еще пытаюсь понять, что именно происходиткогда javascript выполняет свои побитовые операции, поэтому я не удивлюсь, если замутил важную деталь.

Пожалуйста, помогите! Мне нужно понять, что здесь происходит и как обойти это.

Редактировать: в отладчике после манипуляций число отображается как интерпретация двух моих битов, что меня смущает, потому чтоя думал, что он преобразуется обратно в 64-битное число, прежде чем возвращать значение любому пользовательскому коду.

Я действительно не хотел предоставлять свой код, потому что не хотел вдаваться в деталипочему я делаю каждый маленький шаг, но в основном у меня есть двоичный файл с целым числом приращения "count", который является аргументом для двоичной строки. sbs - это сокращение от startBits, которое представляет собой массив позиции первого бита (MSB) слева направо (слева - MSB). По сути, стартовый бит - это позиция на основе 1, которую занимает первый бит (отсюда некоторые странные -1 или +1 здесь или там), а биты tot - это общее количество бит, которое содержит аргумент. Если в массиве стартовых битов (sbs) имеется более одного элемента, то число битов при каждом размещении битов на стартовом бите представляет собой просто общее количество битов, деленное на длину массива стартовых битов. таким образом, если в массиве стартовых битов есть два элемента и итоговый бит 4, то 2 бита MSB значения "count" будут помещены в 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...