Верна ли моя логика в вопросе смещения битов?

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

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

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

Значение «левого» и «правого» зависит от вашего процессора. В процессорах семейства Intel «крайний правый» байт - это x && 0xff.

Pointy 11.09.2018 23:16

@Pointy Мне просто нужно получить крайний правый байт целочисленной переменной y, сейчас ему ничего не назначено, потому что это просто вопрос типа «а что, если». Я все равно на процессоре AMD

Luis Jacobs 11.09.2018 23:17

@Pointy что-нибудь еще, ты можешь рассказать мне о моей логике? Я не знаю, правильно ли я понял первые 3 бита

Luis Jacobs 11.09.2018 23:23

Процессоры AMD и Intel одинаковы. Если у вас есть 32-битное число со значением 1, этот бит 1 будет в младшем байте, а в JavaScript вы получите это с помощью простого & 0xFF. Не нужно перекладывать.

Pointy 11.09.2018 23:26

И теперь, когда я думаю об этом, мой первоначальный комментарий, вероятно, неверен; реализация >> такова, что реализует порядок битов логичный, а не порядок битов / байтов в памяти.

Pointy 11.09.2018 23:27

@Pointy Ах, хорошо, я понимаю. Как насчет трех переменных, которые я сделал, чтобы получить первый второй и третий бит этого байта, я прав?

Luis Jacobs 11.09.2018 23:28

Смотрите мой ответ. Я проверяю это еще раз, чтобы убедиться, что я снова не дурачился;)

Pointy 11.09.2018 23:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.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

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

Luis Jacobs 12.09.2018 02:39

Другие вопросы по теме