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

Что касается вопроса, мне пришлось извлечь правый байт целого числа, затем получить первые 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
Luis Jacobs 12 Сен 2018 в 00:15

1 ответ

Лучший ответ

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

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
0
Pointy 11 Сен 2018 в 21:45