วันพุธที่ 27 พฤศจิกายน พ.ศ. 2556

แปลงเลขฐานแปดเป็นเลขฐานสองด้วยสแตก (Convert octal number to binary number with Stack by Java)

วิธีการในการแปลงเลขฐานนั้นมีหลากหลายวิธี วันนี้จะขอเสนอวิธีการแปลงด้วยสแตก สำหรับการสร้างแสตกสามารถเข้าไปอ่านได้ที่ สร้าง Stack ด้วยภาษา Java (Linked List Implementation) ซึ่งเป็นการสร้างสแตกโดยใช้ Linked List เก็บข้อมูล 

สำหรับวิธีการนี้จะมีขั้นตอนดังนี้

  1. รับตัวเลขฐานแปดเข้ามา
  2. อ่านเลขฐานแปดที่ละตัวจากด้านขวามือ(LSB) มองว่าเลขฐานแปดแต่ละตัวนั้นเป็นเลขฐานสิบ
  3. นำเข้าไปแปลงจากเลขฐานสิบเป็นฐานสอง
  4. เก็บค่าลงสแตกตามลำดับ
  5. กลับไปทำขั้นตอนที่ 2 จนกว่าจะแปลงเลขฐานแปดครบทุกตัว
  6. แสดงค่าทั้งหมดในสแตกก็จะได้การแปลงเลขฐานแปดเป็นเลขฐานสอง
ตัวอย่างเช่น

เลขฐานแปด คือ 416
ทำตามขั้นตอนด้านบนจะได้ว่า
  • รอบที่ 1 พิจารณา 6 สามารถแปลงเป็นเลขฐานสองได้เป็น 110 ก็จะถูกเก็บในสแตกดังนี้


  • รอบที่ 2 พิจารณา 1 สามารถแปลงเป็นเลขฐานสองได้เป็น 001 ก็จะถูกเก็บในสแตกดังนี้


  • และรอบที่ 3 พิจารณา 4 สามารถแปลงเป็นเลขฐานสองได้เป็น 100 ก็จะถูกเก็บในสแตกได้ดังนี้


  • จากนั้นทำการแสดงค่าทั้งหมดในสแตกก็จะได้ผลลัพธ์เป็น 100001110
วิธีการเขียนโค๊ดคือ
  1. ไฟล์ Node.java คือการกำหนดว่าจะให้แต่ละโหนดเก็บค่าอะไร ในที่นี้ก็จะให้เก็บค่าเป็น integer
  2. ไฟล์ Stack.java คือการสร้างเมธอดต่างๆ ที่สำคัญของการใช้สแตก
  3. ไฟล์ ConvertOctalToBinary.java คือไฟล์สำหรับทำตามกระบวนการด้านบน
ไฟล์ ConvertOctalToBinary.java มีโค๊ดดังนี้

public class ConvertOctalToBinary {
public static void main(String... args) {
Stack stack = new Stack();
String octal = "416";
for (int i = octal.length() - 1; i >= 0; i--) {
char facOctNumChar = octal.charAt(i);
String facOctNumStr = String.valueOf(facOctNumChar);
int number = Integer.parseInt(facOctNumStr);
// int number = Integer.parseInt(String.valueOf(octal.charAt(i)));

int countBit = 0;

while (number > 0) {
int bit = number % 2;
stack.push(bit);
number = number / 2;
countBit++;
}
if (countBit < 3) {
for (int j = countBit; j < 3; j++) {
stack.push(0);
}
}
}

System.out.print("Octal number is " + octal + " convert to binary number is ");

while (!stack.isEmptyStack()) {
try {
System.out.print(stack.peek());
stack.pop();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}

อธิบายโค๊ด
  • เมื่อเริ่มต้น for loop ก็จะพิจารณาตัวเลขฐานแปดที่ละตัวแล้วจับโยนเข้าไปที่ while loop เพื่อหาว่าเป็นเลขฐานสองคืออะไร
  • จากนั้นนำเลขที่ได้ใส่ในสแตกที่เตรียมไว้ จนจบ while loop
  • จากนั้นถามว่าในลูปที่ผ่านมาใส่ค่าในสแตกครบ 3 ค่าหรือยัง ทำไมต้อง 3 ค่า?
  • เพราะว่าในการเก็บค่าเลขฐานแปดให้อยู่ในรูปของเลขฐานสองนั้น ต้องใช้เลขฐานสอง 3 bit ดังนั้นจึงต้องตรวจสอบว่าครบ 3 ค่าหรือยัง นั่นก็คือครบ 3 bit หรือยังนั่นเอง หากยังไม่ครบก็จะเติม bit 0 ให้ครบ 3 bit
  • เมื่อทำไปเรื่อยๆ จนหลุดจาก for loop ก็จะสาแสดงค่าทั้งหมดที่อยู่ในสแตก ก็จะได้ผลลัพธ์ที่สวยงาม
ถามว่ายังมีวิธีอื่นอีกมั้ย ตอบได้ว่ามีครับ อีกวิธีการหนึ่งที่คล้ายๆกันคือ คล้ายกันตรงที่จะแปลงเลขฐานสิบเป็นฐานสอง แต่ไม่ได้แปลงทีละตัวอย่างที่แสดงให้ดูในตอนต้น แต่จะแปลงเลขก้อนเดียวเดียวจบได้เลขฐานแปดในรูปแบบเลขฐานสองเลย วิธีการคือ
  1. รับตัวเลขฐานแปดเข้ามา
  2. อ่านเลขฐานแปดทีละตัวจากด้านขวามือ(LSB) จากนั้นทำการแปลงเลขฐานแปดให้เป็นเลขฐานสิบโดยใช้ค่าประจำหลักของเลขฐานแปด
  3. บวกสะสมค่าที่ได้จากการแปลงเป็นเลขฐานสิบ
  4. นำเลขฐานสิบที่ได้ไปแปลงเป็นเลขฐานสองอีกครั้ง
  5. ก็จะได้ผลลัพธ์ที่ต้องการ
หมายเหตุ อาจจะได้ผลลัพธ์ไม่เหมือนวิธีด้านบนทั้งหมด เพราะอาจจะมีการแปลงบางค่าที่ได้จำนวน bit ไม่ครบ 3 bit

ตัวอย่างเช่น
เลขฐานแปด คือ 416
แปลงเป็นเลขฐานสิบโดยใช้ค่าประจำหลักจะได้เป็น
(6 * 8^0)+(1 * 8^1)+(4 * 8^2) = 6 + 8 + 256 = 270
จากนั้นแปลงเลข 270 ที่เป็นเลขฐานสิบให้เป็นเลขฐานสอง จะได้ผลลัพธ์เป็น 100001110

ผลลัพธ์ที่ได้จากทั้งสองวิธีได้เท่ากัน แล้วแต่จะเลือกวิธีการที่ชอบ

หวังว่าคงจะเป็นประโยชน์นะครับ

ดาวน์โหลดโค๊ดเต็มได้ที่นี่