mirror of
https://github.com/Asraelite/littlebigcomputer.git
synced 2025-07-17 08:16:50 +00:00
49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
export function toBitString(n: number, bits: number, signed: boolean = false, littleEndianByteSize: null | number = null): string {
|
|
const minimum = -(2 ** (bits - 1));
|
|
const maximum = signed ? (2 ** (bits - 1)) - 1 : 2 ** bits - 1;
|
|
|
|
if (n < minimum || n > maximum) {
|
|
throw new Error(`Value ${n} out of range for ${bits}-bit ${signed ? 'signed' : 'unsigned'} integer`);
|
|
}
|
|
|
|
if (n < 0) {
|
|
n = (2 ** bits) + n;
|
|
}
|
|
|
|
let result = '';
|
|
for (let i = 0; i < bits; i++) {
|
|
result = (n & 1) + result;
|
|
n >>= 1;
|
|
}
|
|
if (n !== 0) {
|
|
throw new Error(`Internal error: ${n} not zero after conversion to ${bits}-bit ${signed ? 'signed' : 'unsigned'} integer`);
|
|
}
|
|
|
|
if (littleEndianByteSize !== null) {
|
|
const bytes = [];
|
|
for (let i = 0; i < result.length / littleEndianByteSize; i++) {
|
|
bytes.push(result.substring(i * littleEndianByteSize, (i + 1) * littleEndianByteSize));
|
|
}
|
|
result = bytes.reverse().join('');
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function toNote(n: number, bits: number): string {
|
|
if (bits <= 19) {
|
|
return `${n}`;
|
|
} else {
|
|
const scaling = 2 ** (bits - 19);
|
|
return `${(n / scaling).toFixed(5)} x${scaling}`
|
|
}
|
|
}
|
|
|
|
export function toNote24(n: number): string {
|
|
return toNote(n, 24);
|
|
}
|
|
|
|
export function toNote8(n: number): string {
|
|
return toNote(n, 8);
|
|
}
|
|
|