Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาตำแหน่งของบิตที่ต่างกันทางซ้ายสุดสำหรับตัวเลขสองตัวใน C++


ในปัญหานี้เราได้รับสองตัวเลข 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