如何在javascript中使用BigInt的右移运算和异或运算?

问题描述 投票:0回答:1

我想在javascript中向右移动一些位,但我发现结果不正确,因为我用C语言编写了一个测试程序来对比。

我花了一整天都没有找到正确的方法。拜托,你能告诉我正确的方式吗?

const poly = BigInt('0x42F0E1EBA9EA3693');

let crc = BigInt(1);

for (let k = 0; k < 8; k++) {
  crc = poly ^ (crc >> 1n);
  const c1 = crc & 0xFFFFFFFFn;

  console.log('crc:', c1.toString(16).padStart(8, '0'));
}

// output:
// crc: a9ea3693
// crc: 7d1f2dda
// crc: 9765a07e
// crc: e258e6ac
// crc: 58c645c5
// crc: 05891471
// crc: ab2ebcab
// crc: 7c7d68c6
#include <stdio.h>
#include <stdint.h>

int main()
{
  uint64_t poly = 0x42F0E1EBA9EA3693;

  unsigned int crc = 1;
  for (unsigned int k = 0; k < 8; k++)
  {
    crc = poly ^ (crc >> 1);
    printf("crc: %x\n", crc);
  }

  return 0;
}

// output
// crc: a9ea3693
// crc: fd1f2dda
// crc: d765a07e
// crc: c258e6ac
// crc: c8c645c5
// crc: cd891471
// crc: cf2ebcab
// crc: ce7d68c6

我尝试使用 Uint8Array 代替 BigInt 来执行此操作,但结果仍然错误。我该怎么办? 怎么办呢?结果可以像c语言一样。

javascript c bit-shift
1个回答
0
投票

你的 JS

crc
是一个无限宽度的
BigInt
。你的 C
crc
是一个 32 位无符号整数。这意味着
poly
的高 32 位永远不会在
crc = poly ^ (crc >> 1);
计算中使用。你想要 64 位来获得相同的结果:

uint64_t crc = 1;
© www.soinside.com 2019 - 2024. All rights reserved.