码迷,mamicode.com
首页 > 其他好文 > 详细

Single Number II ——位操作

时间:2014-05-01 01:49:44      阅读:380      评论:0      收藏:0      [点我收藏+]

标签:com   http   blog   style   class   div   img   code   c   java   log   

题意:

     给定两个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。

具体代码如下:

mamicode.com,码迷
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; //对两者进行位或操作 
}
mamicode.com,码迷

 

Single Number II ——位操作,码迷,mamicode.com

Single Number II ——位操作

标签:com   http   blog   style   class   div   img   code   c   java   log   

原文地址:http://www.cnblogs.com/chenbjin/p/3701053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!