Přepis C bitové operace JS

0

Otázka

Snažím se přepis následující kód v C do Javascriptu, ale já to nechápu.

#include <stdio.h>
#include <stdlib.h>

long long seed;
int next(int bits) {
 seed=(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
 return (int)(seed >> (48 - bits));
}

void main (void) {
    seed = 0;
    for (int i=0;i<20;i++) {
        printf ("%d\n", next(31));
    }
}

Tohle byl můj pokus, ale dostal jsem jiné výsledky z C kódu:

let seed;
function next(bits) {
 seed = (seed * 0x5DEECE66D + 0xB) & ((1 << 48) - 1);
 return (seed >> (48 - bits));
}

seed = 0;
for ( let i=0; i<20; i++ ) {
    console.log( next(31) );
}

Jak to mohu udělat?

bit-shift bitwise-operators c javascript
2021-11-23 19:16:08
1

Nejlepší odpověď

2

Můžete použít BigInt v javascriptu s BigInt() a n připojeny na číselné literály:

let seed = 0n;

function next(bits) {
  seed = (seed * BigInt(0x5deece66d) + BigInt(0xb)) & ((1n << 48n) - 1n);
  return seed >> (48n - bits);
}

for (let i = 0; i < 20; i++) {
  console.log(next(31n));
}

Výstup:

0n
2116118n
89401895n
379337186n
782977366n
196130996n
198207689n
1046291021n
1131187612n
975888346n
500746873n
1785185521n
2000878121n
1219898729n
1194203485n
109160704n
1647229822n
40619231n
541938462n
640373553n
2021-11-24 16:03:11

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................