โดยปกติเมื่อเราแปลงทศนิยมเป็นเลขฐานสิบหก (ฐาน 16) เราใช้ set0123456789ABCDEF เพื่อจับคู่ตัวเลข
เราจำเป็นต้องเขียนฟังก์ชันที่ทำสิ่งเดียวกันทุกประการ แต่ให้ผู้ใช้มีอิสระในการใช้มาตราส่วนใดๆ มากกว่าที่จะกล่าวข้างต้น
ตัวอย่างเช่น −
The hexadecimal notation of the decimal 363 is 16B But if the user decides to use, say, a scale ‘qwertyuiopasdfgh’ instead of ‘0123456789ABCDEF’, the number 363, then will be represented by wus
นั่นคือสิ่งที่เราต้องทำ
ลองทำสิ่งนี้โดยสร้างฟังก์ชัน toHex() ที่ใช้การเรียกซ้ำเพื่อสร้างฐานสิบหกจากจำนวนเต็ม เพื่อความชัดเจน จะต้องใช้อาร์กิวเมนต์สี่ข้อ แต่จากสี่ข้อนั้น มีเพียงสองข้อแรกเท่านั้นที่จะใช้งานสำหรับผู้ใช้ปลายทาง
อันดับแรกจะเป็นตัวเลขที่จะแปลงเป็นเลขฐานสิบหก และอันดับที่สองคือมาตราส่วนที่กำหนดเอง จะเป็นทางเลือก และหากมีให้มา ควรเป็นสตริงที่มีอักขระ 16 ตัวพอดี มิฉะนั้นฟังก์ชันจะส่งกลับค่าเท็จ อาร์กิวเมนต์อีกสองอาร์กิวเมนต์คือ hexString และ isNegative ซึ่งตั้งค่าเป็นสตริงว่างและบูลีนตามลำดับโดยค่าเริ่มต้น
ตัวอย่าง
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'){
//recursively append the 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