1 /* 2 * 给定两个32位的整数N和M,以及表示比特位置的i和j。编写一个方法,将M插入到N中, 3 * 使得M从N的第j位开始,到第i位结束,假定从j位到i位足以容纳M,也即是M=10011 4 * 那么j和i之间至少可以容纳5个数,假如,不可能出现j=3,i=2的情况,因为第三位和第二位之间放不下M 5 * 例如 6 * N=1000000000(1024) 7 * M=10011(19) 8 * i=2,j=6,输出10001001100 9 * 思路如下: 10 * 1.将N中的从j到i之间清零 11 * 2.对M执行移位操作与j和i之间的位对其 12 * 3.合并M和N 13 * */ 14 public int updateBits(int n,int m,int i,int j) 15 { 16 int allOnes=~0;//创建一连串1 假如为11111111 17 int left=allOnes<<(j+1); //在位置j之前的位均值为1,其余为0,此刻为11100000 18 int right=((allOnes<<i)-1);//在位置i之后的位均置位1,此刻为00000011 19 int mask=left | right; //进行位或运算之后得到 11100011 20 int n_cleared=n& mask; //清除位置j到i的位,然后将M放进去 21 int m_shifted=m<<i; //将M移动到相应的位置 22 return n_cleared | m_shifted; //对两者进行位或操作 23 24 } 25 public static void main(String[] args) { 26 // TODO Auto-generated method stub 27 BitGet bg = new BitGet(); 28 int num=bg.updateBits(1024, 19, 2, 6); 29 System.out.println(Integer.toBinaryString(num)); 30 31 }