题目地址:
https://www.lintcode.com/problem/update-bits/description
给定两个位整数和,再给定两个取值在的两个整数和,并且,要求将的右数第到位改变为,题目保证的二进制表示的长度正好是。
思路是,先将的第到位都变为,然后将左移位再与或起来即可。代码如下:
public class Solution {
/**
* @param n: An integer
* @param m: An integer
* @param i: A bit position
* @param j: A bit position
* @return: An integer
*/
public int updateBits(int n, int m, int i, int j) {
// write your code here
// 构造二进制表示为j - i + 1个1组成的数
int ones = ~0 >>> (32 - (j - i + 1));
// 将n的第i到j位改为0
n = n & (-1 - (ones << i));
// 将m左移i位再与n或
n |= m << i;
return n;
}
}
时空复杂度。