Я бы сделал это:
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