当前位置: 面试刷题>> 更新二进制位 (经典算法题500道)
### 完整题目描述
**题目:更新二进制位**
给定一个非负整数 `num` 和一个位位置 `pos`(从 0 开始计数,即最右边的位为第 0 位),以及一个要更新的位值 `val`(`val` 只能是 0 或 1)。请编写一个函数来更新 `num` 在 `pos` 位置的位值为 `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 示例代码
```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 示例代码
```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 示例代码
```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
```
**码小课** 网站中有更多关于位操作、算法设计和编程技巧的相关内容分享给大家学习,欢迎访问并深入探索。