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;
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- mysql binlog二进制日志详解
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 详解C++编程中对二进制文件的读写操作
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例