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; //对两者进行位或操作 
    }
  • 相关阅读:
    学习 TList 类的实现[1]
    Dll 使用 PChar 参数的小例子
    学习使用资源文件[11]
    【转载】OGRE 内存管理
    【转载】Ogre的内存分配策略
    【转载】.NET面试题系列[0]
    【转载】深入探讨透视投影坐标变换
    【转载】四元数-Quaterion
    【转载】齐次坐标
    【转载】深入研究Windows内部原理绝对经典的资料
  • 原文地址:https://www.cnblogs.com/chenbjin/p/3701053.html
Copyright © 2011-2022 走看看