es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transcriba una operación bitwise en C a JavaScript.

Estoy intentando transcribir el siguiente código en C a JavaScript, pero no lo estoy logrando.

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

long long semilla;
int siguiente(int bits) {
semilla = (semilla * 0x5DEECE66DL + 0xBL) & ((1L << 48) – 1);
return (int)(semilla >> (48 – bits));
}

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

Este fue mi intento, pero obtuve resultados diferentes al código en C:


let semilla;
function siguiente(bits) {
semilla = (semilla * 0x5DEECE66D + 0xB) & ((1 << 48) – 1);
return (semilla >> (48 – bits));
}

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

¿Cómo puedo solucionar esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, las entidades HTML < y > deben ser reemplazadas respectivamente con < y >.

    En segundo lugar, en el código C original, la variable long long seed; tiene un tipo de dato de 64 bits, mientras que en JavaScript el tipo de dato número es un número de punto flotante de 64 bits. Por lo tanto, se recomienda utilizar una biblioteca de números grandes como BigNumber.js o BigInt para manejar correctamente los números grandes en JavaScript.

    Aquí hay una solución de ejemplo utilizando el objeto incorporado BigInt:

    let seed;
    function next(bits) {
      seed = (seed * 0x5DEECE66Dn + 0xBn) & ((1n << 48n) - 1n);
      return Number(seed >> (48n - BigInt(bits)));
    }
    
    seed = 0n;
    for (let i = 0; i < 20; i++) {
      console.log(next(31));
    }
    

    Note el uso del sufijo n para denotar literales BigInt, y la conversión con Number() al retornar desde la función next().

Comments are closed.