【问题标题】:Bitwise operators in Javascript and in generalJavascript 和一般情况下的位运算符
【发布时间】:2011-12-31 11:47:55
【问题描述】:

我正在解析一些二进制文件,我将它们打开并放在ArrayBuffer 中。

在我正在阅读的特定文件结构中,有许多位是boolean,我可以检查它们是否被检查:

(flag & 1) != 0; // bit 0 
(flag & 2) != 0; // bit 1 
(flag & 4) != 0; // bit 2 

等等

但是,我无法获取后面的位值。它们跨越多个位(例如位 4-6)并由 0-7 的整数值组成。

如何读取多个位?我知道这不是一个 JavaScript 问题,而是位和位运算符如何工作的问题。

【问题讨论】:

    标签: javascript bit-manipulation arraybuffer


    【解决方案1】:

    假设您想要这样的字节中的 4-6 位:

    76543210
     ^^^
    

    你会像这样构造一个位掩码:

    0x70
    

    意思是:

    01110000
    

    然后你会用数字 & 向右移动 4 次:

    ( byte & 0x70 ) >> 4
    //Number between 0-7
    

    【讨论】:

    • 在 javascript 中,我仍然建议使用 >>> 而不是 >>。 (在 C 中,转换前转换为无符号)。
    • @selbie 我没有在我的问题中提到这一点,但如果我将字节读取为 Uint,那么它已经是无符号的了吗?
    • & 已经丢弃了潜在的符号位,它位于第 31 位
    • javascript 中没有“无符号整数”之类的东西。有一个“数字”类型,就是这样。所以迈克,我不确定你是如何在 javascript 中读取 UINT 的。 @Esailija - & 运算符的行为在哪里使值无符号被引用?或者它只是 javascript 的副作用,实际上没有数字类型的上限?
    • @selbie,在按位运算之前,所有数字都在javascript中转换为有符号的32位整数(除了>>>,转换为无符号32)。因此,如果它是一个有符号的 8 位整数 -127,那么在 & 操作之前它是 0xFFFFFF81,在这种情况下它是 0x0000000。在任何情况下,符号位都不会通过 AND 保留。
    【解决方案2】:

    假设最低有效位在位置“0”,并且您想要位位置 4-6 之间的 3 位整数。

    var value = (flag >>> 4) & 0x0007;
    

    换句话说,将“标志”右移 4 位,使 4-6 位移到 0-2 位。然后只屏蔽最后三位(二进制 111 = 十进制 7)。

    【讨论】:

    • 我在下面更新了我的答案以使用 javascript“无符号移位”运算符 (>>>) 而不是更常见的 >> 运算符。在任何语言中确保您对无符号类型进行位移始终是一个好主意,因为如果被移动的值是负数(在左侧导入 1 而不是 0),您可能会得到副作用。
    猜你喜欢
    • 2013-09-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多