Everyday Code : addBinary Ep.2

Nuttasit Sukpoom
2 min readNov 14, 2023

--

ความเดินตอนที่แล้ว จากการพยายามแปลงเลขฐาน 10 ไปสู่เลขฐาน 2 ( binary ) กันแล้ว ตอนนี้ก่อนที่จะไปเจอกับโจทย์ Leetcode addBinary ผมคิดว่าอีกส่วนหนึ่งที่สำคัญไม่แพ้กัน ก็คือการแปลงเลขฐาน 2 กลับไปเป็นฐาน 10 กันบ้างครับ

Problem

จงแปลงเลขฐาน 2 ( “10110” ) ให้กลายเป็นเลขฐาน 10 คำตอบของข้อนี้ก็คือ 2 + 4 + 16 = 22 นั้นเอง

เอาล่ะมาเริ่มกันเลย

ขั้นตอนที่ 1: เรารู้อะไรบ้าง ?

  1. มีการกำหนดให้เลข 1 แทนคำสั่ง “เลือก” และ 0 เป็นึคำสั่ง “ไม่เลือก”
  2. Index คือจุดกำหนดเลขยกกำลังของ Binary นับจากขวาสุดมาซ้าย
  3. จุดนี้ที่น่าสนใจมากคือในอีกความหมายหนึ่งของการยกกำลังคือการ Multiplier ขึ้นไปเลื่อยๆในทุกครั้ง
  4. ( 2 ยกกำลัง 0 = 1 ; 2 ยกกำลัง 1 = 1 x 2 ; 2 ยกกำลัง 2 = 1 x 2 x 2 ; 2 ยกกำลัง 3 = 1 x 2 x 2 x 2 )

เราจะเริ่มเห็นรูปแบบของการเริ่มที่เลขตั้งต้น ( 1 ) และทุกครั้งที่เพิ่มขึ้นไปจะมีการ คูณ 2 เข้าไป

Multiplier = 1 ; end Loop x 2 เข้าไปใน Multiplier

ขั้นตอนที่ 2 : คิดกลับ

เรารู้ว่าเราสามารถเขียน Condition IF ด้วยการใช้เลข 0 และ 1 เป็นตัวตั้งในการเลือกหรือไม่เลือก จาก binary EP.1 เราเข้าใจว่าการเลือกไม่เลือกให้ผลรวมได้ตามเป้าหมายของเรานั้น เกิดจากการที่เลขตั้งต้นจะต้องหาร 2 เพื่อแปลงค่าให้เปลี่ยนไปตามรอบในแต่ละ Loop

ถ้าเราต้องการแปลงเลขฐาน 10 เป็นฐาน 2 เราเริ่มค่าตั้งต้นด้วย 128 ( 8 byte หรือ 2⁸) แต่ถ้าเราต้องการแปลงเลขฐาน 2 เป็นฐาน 10 ละ ง่ายนิดเดียว !! กลับกันเท่านั้นเอง

เราจะเริ่มต้นด้วย 2 ^ 0 และใช้รูปแบบที่เราเจอจากขั้นตอนที่ 1 ในการอัพเดทค่ามาดูกันเลย

Let Code !

เงื่อนไข จากขั้นตอนที่ 1 ถ้าเป็น 1 เราเลือก 0 เราไม่เลือก

if(String binary == '1' ) { เก็บค่าลงใน result และบวก result เข้ากับตัวเก่าด้วย }
if(String binary == '0' ) { ไปตัวต่อไปไม่ทำอะไร }

สร้างตัวแปรจากขั้นตอนที่ 1 ทั้งคำตอบ และตัว Multiplier ด้วย

int result = 0; // ไว้เก็บคำตอบและอัพเดทคำตอบตามเงื่อนไข
int multiplier = 1; // ตั้งต้นไว้ที่ 2^0 และเพิ่มขึ้นที่ละ x 2 ไปเลื่อยๆ

เงื่อนไขการ Loop โดยปกติการ Loop เราจะเริ่มต้นจากจุดเริ่มต้นคือ 0 แต่เราจะกลับมันนิดหน่อย จากการใช้ i ในการระบุรอบ เป็น i ในการระบุตำแหน่งแทน ( ลองอ่าน Code ข้างล่างก่อนนะอาจจะเห็นภาพมากขึ้น )

String binary = "10110";
for ( i = binary.length() - 1 ; i>= 0 ; i-- )
binary.charAt(i);
  • charAt() คือการบอกตำแหน่งว่าเราจะชี้ไปที่จุดใดใน String ซึ่งเราจะชี้ไปที่จุดขวาสุด ( binary.length -1 )
  • นั้นก็คือจุดสุดท้าย เพราะเลข Binary จะเริ่มต้นจากขวาไปซ้าย ซึ่งแตกต่างกับเลขฐาน 10 ทั่วไป
  • และจุดที่สำคัญมากๆอีกอย่างคือ i- — เพราะเราต้องการให้เลขถอยจากมากสุดไปน้อยสุด ( ขวาไปซ้าย ) นั้นเอง

เอาหล่ะเราได้ทุกอย่างครบแล้ว

ประกอบร่างง

class Solution{
int convertToBinary(String binary){
int result = 0;
int multiplier = 1;
for(int i = binary.length()-1 ; i>=0 ; i--){
if(binary.charAt(i)=='1') result = result + multiplier ;
if(binary.charAt(i)=='0') { } ; // ไม่ทำอะไรเลย
multiplier = multiplier *2 ; // ทุกครั้งที่ผ่านทุกเงื่อนไข ต้องเลื่อนไปตำแหน่งถัดไป
}
return result ;
}
}

ผลลัพธ์

ยอดเยี่ยม !! เอาหล่ะเรามาได้ถึงครึ่งทางแล้วว ในทั้งหมด 2 EP ที่ผ่านมา ผมคิดว่าเราเข้าใจหลักการแล้วหล่ะ ทั้งการเปลี่ยนกลับ และเปลี่ยนไป คร่าวนี้เราจะมาถึงส่วนใจความสำคัญกันใน EP 3 นั้นก็คือ !! การบวกเลข Binary กันครับผมม วันนี้ผมอยากจะฝาก 2 คำสุดทรงพลังไว้อย่าง Stay Curious ครับทุกคน

--

--