สมมติว่าเรามีตัวเลขบวก 3 ตัว a, b และ c เราต้องหาการพลิกขั้นต่ำที่จำเป็นในบางบิตของ a และ b เพื่อสร้าง (a OR b ==c ) เรากำลังพิจารณาการดำเนินการระดับบิต OR
การดำเนินการพลิกประกอบด้วยการเปลี่ยนแปลงบิตเดียว 1 ถึง 0 หรือเปลี่ยนบิต 0 เป็น 1 ในการแทนค่าไบนารี ดังนั้นถ้า a :0010 และ b :=0110 ดังนั้น c คือ 0101 หลังจากพลิก a จะเป็น 0001 และ b จะเป็น 0100
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ตอบ :=0
- สำหรับฉันอยู่ในช่วง 0 ถึง 31
- bitC :=(c / 2^i) และ 1
- bitA :=(a / 2^i) และ 1
- bitB :=(b / 2^i) และ 1
- ถ้า (bitA OR bitB) ไม่เหมือนกับ bitC ดังนั้น
- ถ้า bitC เป็น 0
- ถ้า bitA =1 และ bitB =1 ให้เพิ่ม ans 2 หรือเพิ่ม ans 1
- มิฉะนั้น เพิ่มขึ้น 1
- ถ้า bitC เป็น 0
- คืนสินค้า
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int minFlips(int a, int b, int c) { int ans = 0; for(int i = 0; i < 32; i++){ int bitC = (c >> i) & 1; int bitA = (a >> i) & 1; int bitB = (b >> i) & 1; if((bitA || bitB) != bitC){ if(!bitC){ if(bitA == 1 && bitB == 1){ ans += 2; } else { ans += 1; } } else{ ans += 1; } } } return ans; } }; main(){ Solution ob; cout << (ob.minFlips(2,6,5)); }
อินพุต
2 6 5
ผลลัพธ์
3