ในปัญหานี้เราได้รับตัวเลข N ซึ่งมีเพียงหนึ่งชุดบิตในการแทนค่าไบนารี งานของเราคือการหาตำแหน่งของบิตที่ตั้งไว้เท่านั้น หากตัวเลขมีชุดบิตเพียงชุดเดียวให้ส่งคืนตำแหน่งของตัวเลขมิฉะนั้นจะพิมพ์ตัวเลขที่ไม่ถูกต้อง
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
N = 32
ผลลัพธ์
6
คำอธิบาย
Binary representation of the number is 10000.
แนวทางการแก้ปัญหา
ข้อเท็จจริงประการหนึ่งที่ควรทราบก่อนดำเนินการต่อไปคือตัวเลขจะมีเพียง 1 ชุดบิตหากเป็นยกกำลัง 2 มิฉะนั้นจะมีจำนวนชุดบิตมากขึ้น
วิธีแก้ไขง่ายๆ คือเริ่มจากบิตขวาสุดแล้วตรวจสอบค่าของบิต เราจะใช้การวนซ้ำตรวจสอบว่ามีการตั้งค่าหรือไม่
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned i = 1, position = 1; while (!(i & n)) { i = i << 1; ++position; } return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
ผลลัพธ์
The position of the number 64 is 7
อีกวิธีหนึ่งในการแก้ปัญหาคือการใช้ shift เพื่อเลื่อนตัวเลขไปทางขวาจนกลายเป็น 0 ในตอนท้าย จำนวนกะที่ทำไปถึง 0 คือตำแหน่งของบิตที่ตั้งไว้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned position = 0; while (n) { n = n >> 1; ++position; } return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
ผลลัพธ์
The position of the number 64 is 7
อีกวิธีหนึ่งในการแก้ปัญหาคือการใช้สูตรคณิตศาสตร์ เรารู้ดีว่า
2i = n, where n is the number and i is the position of the number The values of i here can be found using the formula, i = log2(n)
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> #include <math.h> using namespace std; bool isPowerOfTwo(unsigned n) { if(n>0) { while(n%2 == 0) n/=2; if(n == 1) return true; } if(n == 0 || n != 1) return false; return false; } int findPostionOfSetBit(unsigned n) { unsigned position = log2(n) + 1; ; return position; } int main(void){ int n = 64; if(!isPowerOfTwo(n)) cout<<"Invalid Number!"; else cout<<"The position of the number "<<n<<" is "<<findPostionOfSetBit(n); return 0; }
ผลลัพธ์
The position of the number 64 is 7