Tengo un byte y quiero incrementar los bits que quedan hasta el primer bit en 1 (el contexto es un pequeño Juego de la vida de Conway).
Ejemplo: 11 es 0000 1011 :
1011100000 1101 que es 13Preguntas:
addNeighbour proceda como un método nulo (no pude encontrar una manera de no devolver num )?addNeighbour : const getBinaryRepresentation = (number) => { let str = ""; for (let i = 7; i >= 0; i--) { ((number & (1 << i)) != 0) ? str += "1" : str += "0"; } console.log(str) } let num = 5; getBinaryRepresentation(num) // 0000 0101 const addNeighbour = (num) => { const isAlive = num & 1; const neighbours = num >> 1; num = (neighbours + 1) << 1; if (isAlive === 1) num |= (1 << 0) return num; } num = addNeighbour(num); getBinaryRepresentation(num) // 0000 0111¿Hay alguna manera de hacer que
addNeighbourproceda como un método nulo (no pude encontrar una manera de no devolvernum)?
No. Si no devuelve el resultado, no puede volver a asignarlo a num . Y no puede pasar una referencia a la variable let num (o cualquier otra) que la función deba leer y almacenar.
¿Hay una mejor manera de realizar operaciones
addNeighbour
Sí. Sumar 1 en la posición del segundo bit menos significativo es lo mismo que sumar 2 en la posición de menor significado. Reemplace su código con
num += 2;Dicho en otros términos,
(((num >> 1) + 1) << 1) | (num & 1) ≡ (((num >> 1) << 1) + (1 << 1)) | (num & 1) ≡ ((num & ~1) + (1 << 1)) | (num & 1) ≡ ((num & ~1) | (num & 1)) + (1 << 1) ≡ num + (1 << 1)Como no puede tener byRef en valores simples en javascript, no puede devolver void y cambiar la variable fuera de la función.
Sin embargo, podría optimizar un poco la función reutilizando variables:
const getBinaryRepresentation = (number) => { return console.log(number.toString(2).padStart(8, 0)); } let num = 5; getBinaryRepresentation(num) // 0000 0101 const addNeighbour = (num) => { const isAlive = num & 1; num >>= 1; num = (num + 1) << 1; return num | isAlive; } num = addNeighbour(num); getBinaryRepresentation(num) // 0000 0111