Eu tenho essas duas funções para percorrer os 32 bits de um número inteiro no TypeScript:
export function* walkBitsFromLSB(n: number) {
for (let i = 0; i < 32; i++) {
// Check the least significant bit (LSB)
const bit = (n >> i) & 1
yield bit
}
}
export function* walkBitsFromMSB(n: number) {
// Start with a mask that isolates the MSB of a 32-bit integer
let mask = 1 << 31
for (let i = 0; i < 32; i++) {
// Apply the mask to n and check if the result is non-zero
const bit = n & mask ? 1 : 0
yield bit
// Shift the mask right for the next bit
mask >>>= 1
}
}
Posso modificar o MSB para percorrer apenas os bits "relevantes", assim:
export function* walkRelevantBitsFromMSB(n: number) {
let mask = 1 << 31;
let start = false; // Flag to indicate when we've found the first non-zero bit
for (let i = 0; i < 32; i++) {
const bit = n & mask ? 1 : 0;
if (bit === 1) start = true;
if (start) yield bit; // Only start yielding bits after the first 1 is encountered
mask >>>= 1;
}
}
Como você pode fazer o mesmo para a função LSB de uma maneira ideal?
Ou seja, se os bits fossem 0b00000000000000000001111011101101
, você leria:
1
0
1
1
0
1
1
1
0
1
1
1
1
DONE
Como você poderia fazer isso sem criar um armazenamento de cache/hashmap { [binaryNumber]: length }
ou qualquer tipo de hashtable como esse. Como você pode simplesmente derivá-lo da entrada n
para a função, o comprimento em que você para de verificar os valores?
1 respostas