/**
* 功能:给定两个32位的整数N与M,以及表示比特位置的i与j。编写一个方法,将M插入N,使得M从N的第j位开始,
* 到第i位结束。假定从j为到i位足以容纳M,也即若M=10011,那么j和i之间至少可以容纳5个位。例如,不可能出现j=3
* 和i=2的情况,因为第3位和第2位之间放不下M。
*/
注意:M和N的输入进制数
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1=Integer.toBinaryString(updateBits(1024, 19, 2, 6));
System.out.println(s1);
String s2=Integer.toBinaryString(updateBits2(1024, 19, 2, 6));
System.out.println(s2);
}
两种方法:
方法一:
public static int updateBits(int n,int m,int i,int j){
int mask=~(1<<(j+1)-1);
for(int k=i-1;k>=0;k--){
mask+=1<<k;
}
int result=n&mask|(m<<i);
return result;
}
方法二:
public static int updateBits2(int n,int m,int i,int j){
int allOnes=~0;
int left=allOnes<<(j+1);
int right=(1<<i)-1;
int mask=left|right;
int n_cleared=n&mask;
int m_shifted=m<<i;
return n_cleared|m_shifted;
}