Search code examples
javascriptcbit-shift

How use BigInt that right shift operation and XOR in javascript?


I want move some of bit toward right in javascript, but I found result was not right because I wrote a test program by C language to contradistinction.

I spend whole day who had't found correct way. please, Could you tell me that right way.

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

I try used Uint8Array to do it instead of BigInt, but result still error. How can i do ? How do it ? result can like c language.


Solution

  • Your JS loop fails to update crc in the same way as the C program. To achieve the same result as the C program, replace

    const c1 = ...
    

    with

    crc = ...
    

    This causes the bits of higher-precision to be dropped, just like in the C program.

    const poly = BigInt('0x42F0E1EBA9EA3693');
    
    let crc = BigInt(1);
    
    for (let k = 0; k < 8; k++) {
      crc = poly ^ (crc >> 1n);
      crc = crc & 0xFFFFFFFFn;
    
      console.log('crc:', crc.toString(16).padStart(8, '0'));
    }