我对一个令人生厌的问题的逻辑正确吗?

时间:2018-09-11 21:15:13

标签: javascript bit-manipulation bitwise-operators bit-shift

我即将完成一个分配,并且在最后一个问题上,我试图做到这一点,但是我不知道我是否正确使用了移位。

对于这个问题,我必须提取整数的右字节,然后获取该右字节的前3位,后3位和后2位,并将其分配给无符号整数变量。

到目前为止,我尝试过的是:

OrdDict

我想知道我是否朝着正确的方向前进

1 个答案:

答案 0 :(得分:0)

我会这样做:

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