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