บทนำ
สร้างจำนวนใหม่โดยนำบิตมาจากสองจำนวนสลับกัน: บิตที่ 1 (LSB) จากจำนวนที่ 2, บิตที่ 2 จากจำนวนที่ 1, บิตที่ 3 จากจำนวนที่ 2, ...
ตัวอย่าง
n=6 (0110), m=10 (1010) → เรียงบิตสลับ: 0(from m), 1(from n), 0(from m), 1(from n) → 0101? Wait, ตัวอย่างในต้นฉบับให้ 0010 = 2
อธิบาย: ใช้บิตคู่ของ n (even bits) และบิตคี่ของ m (odd bits) นำมารวมด้วย bitwise OR
อัลกอริทึม
- หาบิตคู่ (even bits) ของ n ที่เป็น 1
- หาบิตคี่ (odd bits) ของ m ที่เป็น 1
- ผลลัพธ์ = (even bits of n) | (odd bits of m)
ตัวอย่างโค้ด C++
#include <iostream>
using namespace std;
int setevenbits(int n) {
int temp = n, count = 0, res = 0;
for (temp = n; temp > 0; temp >>= 1) {
if (count % 2 == 1) // even position (0-indexed: 1,3,5...)
res |= (1 << count);
count++;
}
return (n & res);
}
int setoddbits(int m) {
int count = 0, res = 0;
for (int temp = m; temp > 0; temp >>= 1) {
if (count % 2 == 0) // odd position (0-indexed: 0,2,4...)
res |= (1 << count);
count++;
}
return (m & res);
}
int main() {
int n = 12, m = 17;
int setn = setevenbits(n);
int setm = setoddbits(m);
int result = setn | setm;
cout << result;
return 0;
}
ผลลัพธ์
25