zoukankan      html  css  js  c++  java
  • 给定两个32位的整数N和M,以及表示比特位置的i和j。编写一个方法,将M插入到N中, * 使得M从N的第j位开始,到第i位结束

     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     }
  • 相关阅读:
    [BZOJ2296] [POJ Challenge] 随机种子
    [BZOJ1026] [SCOI2009] windy数 (数位dp)
    [BZOJ1306] [CQOI2009] match循环赛 (搜索)
    [BZOJ2654] tree (kruskal & 二分答案)
    [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
    [BZOJ1552] [Cerc2007] robotic sort (splay)
    [BZOJ3110] [Zjoi2013] K大数查询 (树套树)
    BZOJ3611: [Heoi2014]大工程
    BZOJ2286: [Sdoi2011]消耗战
    BZOJ3876: [Ahoi2014]支线剧情
  • 原文地址:https://www.cnblogs.com/luoweiKnowledge/p/3960741.html
Copyright © 2011-2022 走看看