ปกติเวลาแปลงฐานสิบเป็นฐานสิบหก (base 16) เราใช้ชุด 0123456789ABCDEF แมปตัวเลข
เราต้องเขียนฟังก์ชันทำอย่างเดียวกันแต่อนุญาตให้ผู้ใช้ระบุชุดตัวอักษรเองได้
เช่น
เลขฐานสิบหกของ 363 คือ 16B แต่ถ้าผู้ใช้เลือกชุด 'qwertyuiopasdfgh' แทน '0123456789ABCDEF' เลข 363 จะแทนด้วย wus
นั่นคือสิ่งที่เราต้องทำ
สร้างฟังก์ชัน toHex() ใช้ recursion สร้าง hex จากจำนวนเต็ม รับ 4 อาร์กิวเมนต์ แต่อันที่ 1-2 สำคัญต่อผู้ใช้
อันแรก คือตัวเลขที่จะแปลง อันที่สอง คือ custom scale เป็นทางเลือก ถ้าระบุมาต้องเป็นสตริง 16 ตัวอักษรพอดี มิฉะนั้นคืน false อาร์กิวเมนต์อีกสองคือ hexString และ isNegative ค่าเริ่มต้นคือสตริงว่างและ boolean
ตัวอย่าง
const num = 363;
const toHex = (
num,
hexString = '0123456789ABCDEF',
hex = '',
isNegative = num < 0
) => {
if(hexString.length !== 16){
return false;
}
num = Math.abs(num);
if(num && typeof num === 'number'){
// recursive append remainder to hex and divide num by 16
return toHex(Math.floor(num / 16), hexString,
`${hexString[num%16]}${hex}`, isNegative);
};
return isNegative ? `-${hex}` : hex;
};
console.log(toHex(num, 'QWERTYUIOPASDFGH'));
console.log(toHex(num));
console.log(toHex(num, 'QAZWSX0123456789'))
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น
WUS 16B A05