我对移位问题的逻辑正确吗?

Is my logic on a bitshifting question right?

我刚刚完成作业,在最后一个问题上我尝试这样做,但我不知道我是否正确使用了移位。

对于这个问题,我必须提取一个整数的右字节,然后获取右字节的前 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

我只是想知道我的方向是否正确

我会这样做:

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