ในปัญหานี้เราได้รับสองตัวเลข num1 และ num2 งานของเราคือการหาตำแหน่งของบิตที่เหมือนกันทางซ้ายสุดของตัวเลขสองตัว เราจำเป็นต้องพิมพ์บิตแรกซึ่งไม่เหมือนกันสำหรับตัวเลขทั้งสองในการแทนค่าไบนารีตามลำดับ ความยาวของทั้งสองต้องเท่ากันเพื่อค้นหาบิต ทำได้โดยเติม 0 ต่อท้ายตัวเลขที่มีบิตน้อยกว่า
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
num1 = 4, num2 = 7
ผลลัพธ์
1
คำอธิบาย
การแทนค่าไบนารีของ 4 คือ 100
การแทนค่าไบนารีของ 7 คือ 111
บิตแรกไม่เหมือนกัน
แนวทางการแก้ปัญหา
แนวทางในการแก้ปัญหาคือขั้นแรกให้จำนวนบิตเท่ากันในทั้งสองจำนวนโดยคูณด้วย 2 (ความแตกต่างของบิต) . และการรับ XOR ของตัวเลขทั้งสองซึ่งจะคืนค่า 1 เฉพาะในตำแหน่งที่บิตต่างกัน ดังนั้นใน XOR นี้ เราจะหาตำแหน่งแรกแล้วบวก 1 เข้าไปเพื่อให้ได้ตำแหน่งที่ต้องการ
อัลกอริทึม
ขั้นตอนที่ 1 − ทำให้บิตของตัวเลขเท่ากันโดยคูณน้อยกว่าด้วย (2 ^ (ความแตกต่างของความยาวบิต))
ขั้นตอนที่ 2 − ดำเนินการ XOR บน num1 และ num2
ขั้นตอนที่ 3 − ความแตกต่างของบิตเท่ากับผลรวม (bitCount - XORbitCount + 1)
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream>
#include <math.h>
using namespace std;
int findmisMatchBit(int num1, int num2) {
if (num1 == num2)
return 0;
int num1Size = floor(log2(num1)) + 1;
int num2Size = floor(log2(num2)) + 1;
int BitSizeDiff = abs(num1Size - num2Size);
int maxBitSize = max(num1Size, num2Size);
if (num1Size > num2Size)
num2 *= pow(2, BitSizeDiff);
else
num1 *= pow(2, BitSizeDiff);
int XOR = num1 ^ num2;
int XORBitSize = floor(log2(XOR)) + 1;
return (maxBitSize - XORBitSize + 1);
}
int main() {
int num1 = 43, num2 = 765;
cout<<"The position of leftmost dis-similar bit of the two
number is "<<findmisMatchBit(num1, num2);
return 0;
} ผลลัพธ์
The position of leftmost dis-similar bit of the two number is 4