您的位置:首页 > 其它

LintCode 更新二进制位

2015-12-03 21:47 211 查看


LintCode    更新二进制位

给出两个32位的整数N和M,以及两个二进制位的位置i和j。写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串)
样例

给出N = (10000000000)2,M = (10101)2, i = 2, j = 6
返回 N = (10001010100)2
思路分析:首先将给出的整数转换为二进制的形式,可以用两个32位的数组m,n分别存储转换的二进制。然后m数组的相应位替换掉n数组的相应位。再将替换之后的数组m'转换为整数。在转换的过程中注意正负数的不同。对于正数,最高位m'[31]为0,正数M‘ = 2^0 * m'[0]  +

 2^1 * m'[1] +  +  2^2
* m'[2]  +  ……+
2^31 * m'[31]。而对于负数,负数M‘ = -{2^0 * (1 - m'[0])  +  2^1
*(1 -  m'[1] )+  +  2^2 *(1 -  m'[2])  +  ……+ 2^31 * (1 - m'[31])} - 1。代码如下:

public int updateBits(int n, int m, int i, int j) {
// write your code here
byte[] arrm = new byte[32];
byte[] arrn = new byte[32];
int sum = 0;

for(int k = 0; k <= 31; k++) {
arrm[k] = (byte) (m & 1);
arrn[k] = (byte) (n & 1);
m>>=1;
n>>=1;
}
for(int x = i; x <= j; x++)
arrn[x] = arrm[x - i];

for(int l = 0; l < 32; l++) {
if(arrn[l] == 1 && arrn[31] == 0)
sum += Math.pow(2, l);
if(arrn[l] == 0 && arrn[31] == 1)
sum += Math.pow(2, l);
}
if(arrn[31] == 1) return - sum - 1;
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lintcode 二进制 算法