当前位置: 面试刷题>> 更新二进制位 (经典算法题500道)


完整题目描述

题目:更新二进制位

给定一个非负整数 num 和一个位位置 pos(从 0 开始计数,即最右边的位为第 0 位),以及一个要更新的位值 valval 只能是 0 或 1)。请编写一个函数来更新 numpos 位置的位值为 val。注意,你不能使用任何内置的按位操作函数,如 &, |, ^, ~ 等。

示例 1:

输入: num = 11010, pos = 2, val = 0
输出: 11000
解释: 第 2 位(从右向左数,第 0 位是最右边的位)现在是 1,我们需要将其更新为 0。

示例 2:

输入: num = 7, pos = 3, val = 1
输出: 31
解释: 第 3 位(从右向左数,第 0 位是最右边的位)现在是 0,我们需要将其更新为 1。
7 的二进制表示为 111,更新后变为 00011111,也就是 31。

注意:

  • 0 <= num <= 2^31 - 1
  • 0 <= pos <= 31

PHP 示例代码

function updateBit($num, $pos, $val) {
    $mask = 1 << $pos; // 创建掩码,将1左移pos位
    if ($val === 0) {
        // 如果val为0,则使用掩码的反码与num进行与操作,实现清零
        $num = $num & ~$mask;
    } else {
        // 如果val为1,则直接使用掩码与num进行或操作,实现置1
        $num = $num | $mask;
    }
    return $num;
}

// 示例调用
echo updateBit(11010, 2, 0); // 输出 11000,十进制表示为 28
echo "\n";
echo updateBit(7, 3, 1); // 输出 31

Python 示例代码

def update_bit(num, pos, val):
    mask = 1 << pos  # 创建掩码,将1左移pos位
    if val == 0:
        # 如果val为0,则使用掩码的反码与num进行与操作,实现清零
        num = num & ~mask
    else:
        # 如果val为1,则直接使用掩码与num进行或操作,实现置1
        num = num | mask
    return num

# 示例调用
print(update_bit(11010, 2, 0))  # 输出 11000,十进制表示为 28
print(update_bit(7, 3, 1))  # 输出 31

JavaScript 示例代码

function updateBit(num, pos, val) {
    let mask = 1 << pos; // 创建掩码,将1左移pos位
    if (val === 0) {
        // 如果val为0,则使用掩码的反码与num进行与操作,实现清零
        // 注意:JavaScript中按位非操作(~mask)将得到一个负数,但由于我们只在二进制层面操作,不影响最终结果
        num = num & (~mask);
    } else {
        // 如果val为1,则直接使用掩码与num进行或操作,实现置1
        num = num | mask;
    }
    return num;
}

// 示例调用
console.log(updateBit(11010, 2, 0)); // 输出 11000,十进制表示为 28
console.log(updateBit(7, 3, 1)); // 输出 31

码小课 网站中有更多关于位操作、算法设计和编程技巧的相关内容分享给大家学习,欢迎访问并深入探索。

推荐面试题