Правильна ли моя логика в вопросе битшифтинга? - PullRequest
0 голосов
/ 12 сентября 2018

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

Для вопроса мне пришлось извлечь правильный байтцелое число, затем получите первые 3 бита, следующие 3 бита и последние 2 бита этого правого байта и назначьте его целочисленным переменным без знака.

То, что я до сих пор пробовал, это:

   int rightmost = (y>>24)&0xFF // to get rightmost byte
   int first = (rightmost <<< 1)&0xFF // to get first 3 bits of that byte
   int second = (rightmost >>> 3)&0xFF // to get next 3 bits
   int third = (rightmost >>> 6)&0xFF // to get last 2 bits

Мне бы просто хотелось узнать, иду ли я в правильном направлении

1 Ответ

0 голосов
/ 12 сентября 2018

Я бы сделал это:

var firstByte = y & 0xff;

Это наименее значимый байт.Если значение в y равно 12, все биты будут в этом байте.

Затем, чтобы изолировать части этого байта, вы должны использовать & для отсечки всех битов.Вы не хотите, а затем >>, чтобы получить биты в наименее значимые позиции.Порядок, в котором вы это делаете, не имеет значения, хотя он диктует то, что вы положили на другую сторону &:

var first3 = firstByte & 0x07; // no need to shift
var second3 = (firstByte >> 3) & 0x07; // shift by 3 and then mask off the rest
var last2 = (firstByte >> 6) & 0x03; // shift by 6 and mask

В двоичном формате 0x07 выглядит как 00000111.Таким образом, использование & с этим позволяет выделить 3 младших разряда в числе.

Тест ниже.

JavaScript довольно странный, потому что между всеми этими операциями язык поддерживает числакак 64-битные значения с плавающей точкой.Однако для целочисленных значений это не имеет большого значения, и, действительно, оптимизированное время выполнения может не поддерживать представления с плавающей запятой, если они действительно умны в вещах.

    var y = 2359; // binary: 100100110111

    var firstByte = y & 0xff;
    console.log("firstByte: " + firstByte);

    var first3 = firstByte & 0x07;
    console.log("should be 7: " + first3); // should be 7

    var second3 = (firstByte >> 3) & 0x07;
    console.log("should be 6: " + second3); // should be 6

    var last2 = (firstByte >> 6) & 0x03;
    console.log("should be 0: " + last2); // should be 0
...