// 将一个数的二进制表示中从第 n 位（从右往左数）开始的 m 位设为另一个数的二进制表示的最后 m 位。
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    int num1, num2, n, m;
    cout << "请输入两个整数: ";
    cin >> num1 >> num2;
    cout << "请输入起始位n和位数m: ";
    cin >> n >> m;

    cout << "开始的 num1 二进制为: " << bitset<32>(num1) << endl;
    cout << "开始的 num2 二进制为: " << bitset<32>(num2) << endl;

    // 对 num1 进行预处理
    int mask = (1 << m) - 1; // 生成 m 位全 1 的掩码
    int mask_2 = mask;       //一份 mask 拷贝, 用于后续处理 num2
    mask = mask << n;        // mask 左移 n 位
    mask = ~mask;            // mask 掩码按位取反
    num1 &= mask;            // 将 num1 从第 n 位开始 (从右向左) 的 m 位重置为 0
    cout << "预处理后 num1 二进制为: " << bitset<32>(num1) << endl;

    // 对 num2 进行预处理
    num2 &= mask_2;   // 保留 num2 的后 m 位, 其余位重置为0
    num2 = num2 << n; // num2 再向左移位 n
    cout << "预处理后 num2 二进制为: " << bitset<32>(num2) << endl;

    // 将处理后的 num1 和 num2 相或
    num1 |= num2;

    cout << "处理后的 num1 二进制为: " << bitset<32>(num1) << endl;

    return 0;
}