Я почти закончил с заданием, и по последнему вопросу я попытался это сделать, но я не знаю, правильно ли я использовал сдвиг битов.
Что касается вопроса, мне пришлось извлечь правый байт целого числа, затем получить первые 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
Я просто хотел бы знать, иду ли я в правильном направлении
@Pointy Мне просто нужно получить крайний правый байт целочисленной переменной y, сейчас ему ничего не назначено, потому что это просто вопрос типа «а что, если». Я все равно на процессоре AMD
@Pointy что-нибудь еще, ты можешь рассказать мне о моей логике? Я не знаю, правильно ли я понял первые 3 бита
Процессоры AMD и Intel одинаковы. Если у вас есть 32-битное число со значением 1
, этот бит 1
будет в младшем байте, а в JavaScript вы получите это с помощью простого & 0xFF
. Не нужно перекладывать.
И теперь, когда я думаю об этом, мой первоначальный комментарий, вероятно, неверен; реализация >>
такова, что реализует порядок битов логичный, а не порядок битов / байтов в памяти.
@Pointy Ах, хорошо, я понимаю. Как насчет трех переменных, которые я сделал, чтобы получить первый второй и третий бит этого байта, я прав?
Смотрите мой ответ. Я проверяю это еще раз, чтобы убедиться, что я снова не дурачился;)
Я бы сделал это:
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.info("firstByte: " + firstByte);
var first3 = firstByte & 0x07;
console.info("should be 7: " + first3); // should be 7
var second3 = (firstByte >> 3) & 0x07;
console.info("should be 6: " + second3); // should be 6
var last2 = (firstByte >> 6) & 0x03;
console.info("should be 0: " + last2); // should be 0
Спасибо! Я знал, что моя логика была в некоторой степени верной по поводу второго и третьего, но я не был уверен насчет маскировки на них, я действительно ценю понимание!
Значение «левого» и «правого» зависит от вашего процессора. В процессорах семейства Intel «крайний правый» байт - это
x && 0xff
.