Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript和一般语言中的位运算符_Javascript_Bit Manipulation_Arraybuffer - Fatal编程技术网

Javascript和一般语言中的位运算符

Javascript和一般语言中的位运算符,javascript,bit-manipulation,arraybuffer,Javascript,Bit Manipulation,Arraybuffer,我正在解析一些二进制文件,我打开了它们,并将它们放在ArrayBuffer中 在我正在阅读的特定文件结构中,有许多位是布尔值,我可以检查它们是否通过以下方式进行检查: (flag & 1) != 0; // bit 0 (flag & 2) != 0; // bit 1 (flag & 4) != 0; // bit 2 等等 但是,我在获取后面的位的值时遇到困难。它们跨越多个位(例如位4-6),由0-7之间的整数值组成 多个比特是如何读取的?我知道这不是一个Ja

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

在我正在阅读的特定文件结构中,有许多位是
布尔值
,我可以检查它们是否通过以下方式进行检查:

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

但是,我在获取后面的位的值时遇到困难。它们跨越多个位(例如位4-6),由0-7之间的整数值组成


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

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

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

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

假设您希望从如下字节中获得4-6位:

76543210
 ^^^
0x70
您可以像这样构造位掩码:

76543210
 ^^^
0x70
这意味着:

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

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

我更新了下面的答案,使用javascript“unsigned shift”操作符(>>>),而不是更常见的>>操作符。在任何语言中,确保对无符号类型进行位移位都是一个好主意,因为如果移位的值为负(1在左侧导入,而不是0)。在javascript中,我仍然建议使用>>>而不是>>进行移位。(在C中,在移位之前转换为无符号)。@selbie我在问题中没有提到这一点,但是如果我将字节读为Uint,它将已经无符号了吗?&已经丢失了潜在的符号位,它位于位置31。javascript中没有“无符号整数”这样的东西。有一个“数字”类型,就是它。迈克,我不知道你是怎么读javascript的UINT的@Esailija-运算符使值被引用为无符号的行为在哪里?或者这只是javascript对数字类型没有上限的副作用?@selbie,在按位操作之前,所有数字在javascript中都转换为有符号32位整数(除了>>>,转换为无符号32)。因此,如果它是一个有符号的8位整数
-127
,则在&操作之前是
0xFFFFFF81
,在这种情况下,之后是
0x0000000
。在任何情况下,符号位都不会通过AND持久化。