javascript - 如何将值打包为有符号 32 int

标签 javascript c bitwise-operators

我有一个数组:

[43, 44, 45, 46, 47, 2]

我需要将其转换为一个 32 位无符号整数。因此前 5 个值每个使用 6 位,最后一个值使用 2 位。

C上,这段代码看起来像:

 varToPack = (array[0] &0x3F) +
              ( (array[1]<<6) &0x3F) +
              ( (array[2]<<12) &0x3F) +
              ( (array[3]<<18) &0x3F) +
              ( (array[4]<<24) &0x3F) +
              ( (array[5]<<30) &3)

我想在 JS 上做同样的事情,我做了并且它有效:

let varToPack = arr[0]+
(arr[1]<<6)+
(arr[2]<<12)+
(arr[3]<<18)+
(arr[4]<<24)+
(arr[5]<<30);

但仅当 array[5] 中的最后一个值为 01 时。将最后一个值设置为 2 后,我得到负数。所以根据这个答案:

Bitwise operations on 32-bit unsigned ints?

我做了以下修改:

let varToPack = arr[0]+
(arr[1]<<6)+
(arr[2]<<12)+
(arr[3]<<18)+
(arr[4]<<24)+
((arr[5]<<30)>>>0);

这是可行的,但总的来说,它返回值聚集然后2147483648,因为我没有使用&0x3F,它不会让数字大于6位。

但是当我这样做时:

let varToPack = (arr[0]&0x3F)+
                ((arr[1]<<6)&0x3F)+
                ((arr[2]<<12)&0x3F)+
                ((arr[3]<<18)&0x3F)+
                ((arr[4]<<24)&0x3F)+
                (((arr[5]<<30)>>>0)&3);

它返回 0。我做错了什么?

最佳答案

这不起作用的原因:

let varToPack = (arr[0]&0x3F)+
                ((arr[1]<<6)&0x3F)+
                ((arr[2]<<12)&0x3F)+
                ((arr[3]<<18)&0x3F)+
                ((arr[4]<<24)&0x3F)+
                (((arr[5]<<30)>>>0)&3);

是因为您首先移动每个值,然后执行逻辑 AND。由于您想要的位已移出 AND 指定的位置,因此所有内容都被屏蔽掉。您想要屏蔽这些值,然后然后移动它们。另外,使用逻辑或而不是加法,因为这样可以更准确地反射(reflect)您实际在做什么。

let varToPack = (a[0] &0x3F) |
              ( (a[1] & 0x3f) <<6) |
              ( (a[2] & 0x3f) <<12) |
              ( (a[3] & 0x3f) <<18) |
              ( (a[4] & 0x3f) <<24) |
              (( (a[5] & 0x3) <<30) >>> 0);

对于负值,Javascript 对 32 位有符号值执行所有按位运算(然后将结果转换为 64 位 float ),因此结果为负数也就不足为奇了。

但是,您存储的值存在于结果变量中。如果您从相关值中提取位,您将得到原始值:

let b = [];
b[0] = varToPack & 0x3f;
b[1] = (varToPack >>> 6) & 0x3f;
b[2] = (varToPack >>> 12) & 0x3f;
b[3] = (varToPack >>> 18) & 0x3f;
b[4] = (varToPack >>> 24) & 0x3f;
b[5] = (varToPack >>> 30) & 0x3;

关于javascript - 如何将值打包为有符号 32 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53541491/

相关文章:

javascript - 使用 JavaScript 动态生成的选择选项下拉菜单

c - c! 是什么意思? ='\n' 在 for 语句中做什么?

c - 为什么 2 的 32 次方会产生以字节而不是位为单位的数字?

c - 从 Fortran 到 C 的 DATA 语句

javascript - UI 路由器内联模板

javascript - Ember 1.0.0 输入类型 radio 'checked' 绑定(bind)在属性更改时未更新

C# 按位相等 bool 运算符

Prolog是和=。为什么它们不以与逻辑约束相同的方式工作?

java - 按位操作不与 Java 中的 print() 中的字符串连接

c# - 助手与 C# 类?什么时候用什么