zoukankan      html  css  js  c++  java
  • Single Number II ——位操作

    题意:

         给定两个32位的整数 N 和 M,以及表示比特位置的 i 与 j 。编写一个方法,将 M 插入 N,使得 M 从 N 的第 j 位开始,到第 i 位结束。假定从 j 位到 i 位足以容纳M。

    输入:N = 10000101000,M = 10011,i = 2, j = 6

    输出:N = 10001001100

    解题思路 :

       根据题意,我们将问题解决分为三个步骤:

      (1)将 N 中从 j 到 i 之间的位清零;

      (2)对 M 进行移位操作,M << i

      (3)合并 M 与 N 。

      为了完成步骤1,我们可以使用掩码来清零,除j到i之间的位为0外,这个掩码其余位为1。例如本题中,i = 2,j = 6,则掩码为11110000011。

    具体代码如下:

    public int updateBits(int n,int m,int i,int j) {
        /*
         *创建掩码,用来除 n中 i到 j的位
         *本题中,i = 2,j = 6,则掩码为11110000011 
         */
        int allOnes = ~0; //一连串的 1 
        
        //在位置 j 之前的位均为1,其余为0,则 left = 11110000000
        int left = allOnes << (j + 1);                         
                
        //在位置 i 之后的位均为1,其余为0,则right = 00000000011
        int right = ((1 << i) - 1);                             
        
        //除 i 到 j的位为 0,其余为1 则mask = 11110000011
        int mask = left | right;
             
        int n_cleared = n & mask; //清楚n中j到i的位    
        int m_shifted = m << i;  //将M移至相应的位置 
        
        return n_cleared | m_shifted; //对两者进行位或操作 
    }
  • 相关阅读:
    弹性盒模型
    CSS3属性
    CSS3选择器
    闭包
    angularjs-select2的使用
    angular 分页插件的使用
    webstorm 破解
    数组和字符串之间的转化
    git 拉取分支代码 合分支
    时间戳转化为时间格式 时间格式转为时间戳
  • 原文地址:https://www.cnblogs.com/chenbjin/p/3701053.html
Copyright © 2011-2022 走看看