首页 > 试题广场 >

二进制插入

[编程题]二进制插入
  • 热度指数:12253 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定两个32位整数n和m,同时给定i和j,将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零,且m的二进制位数小于等于i-j+1,其中二进制的位数从0开始由低到高。

测试样例:
1024,19,2,6
返回:1100
这个i没啥意义啊

class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        return n | (m << j);
    }
};

发表于 2018-12-26 15:19:35 回复(0)
思路:
题目保证 j 到i 为0. 那么m左移j位后与 n相加即可
# -*- coding:utf-8 -*-
class BinInsert:
    def binInsert(self, n, m, j, i):
        m = m << j
        return n + m
另一种思路是 m左移j位后与n做或运算
# -*- coding:utf-8 -*-
class BinInsert:
    def binInsert(self, n, m, j, i):
        m = m << j
        return n | m

发表于 2016-08-03 19:31:33 回复(0)
此题要注意负数的情况!!!代码如下:
import java.util.*;

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        // write code here
        if(i<j)
            return 0;
        int flagm=1;
        int flagn=1;
        flagn=flagn<<j;
        //int count=1;
        while(flagm!=0){
            if((flagm & m)!=0){
                n=(n|flagn);
            }
            flagn=flagn<<1;
            flagm=flagm<<1;
           
        }
        return n;
    }
    
}

发表于 2015-11-19 22:26:59 回复(3)
思路
                    i       j    
1024:100000000 00
19    :        10011
可以看到上面得出,只要我们用1011与1024的第j位到第i位做或运算(|)即可。
我们想到可以让10011左移j位就可以正常做运算了。
10000000000
00001001100
-------------------
10001001100 ---->1100(十进制)
代码
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // m左移j位
        m <<= j;
        return n | m;
    }
};

发表于 2015-08-19 22:16:42 回复(11)
//其实我纠结的是题目的意思,语文老师我对不起你,题目说的保证是它保证还是我保证,想想昧着良心先试试吧,竟然AC了,那么问题来了,题目不保证输入的合法,假设不合法输出-1,该怎么判断??
//AC的代码
public int binInsert(int n, int m, int j, int i) {
        return (m<<j)^n;
    }

发表于 2017-05-13 17:20:54 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        return n + (m << j);
    }
};

发表于 2016-05-08 11:08:40 回复(1)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        return (n+(m<<j));
    }
};
因为他保证n的第i位到第j位都是0,并且m的二进制位数不会超过(i-j),所以将n的第i位到第j位替换成m的二进制位,本质上就是n加上m扩大(2^j)倍后的结果
编辑于 2019-11-19 21:20:00 回复(0)
Ron头像 Ron
   /*已说明n不会超过i-j+1长度且m中i到j全为0*/
    public int binInsert(int n, int m, int j, int i) {
       	int put = m << j;//signed left shift
    	int res = n|put;
    	return res;
    }

编辑于 2015-10-08 14:54:06 回复(0)
m = m << j;
return n | m;
发表于 2015-07-27 18:04:20 回复(0)
public int binInsert(int n, int m, int j, int i) {
    return n + m * (int)Math.pow(2, j);
}

发表于 2019-11-01 21:28:07 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        int mask = pow(2,i-j+1)-1;
        return n - (n & (mask << j)) + ((m & mask) << j);
    }
};
发表于 2017-09-01 22:44:02 回复(0)
/*
思路:搬移

直接把m向左移动j位然后和n相或即可

n : 1 0 0 0 1
m :         1

m<<2:100

m|n

10100

*/
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {

        m <<= j;

        n |= m;

        return n;
    }
};

发表于 2023-04-13 15:22:56 回复(0)
import java.util.*;

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        return (n^(m<<j));
    }
}

发表于 2023-03-07 21:04:22 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        m <<= j;
        int tmp = n | m;
        return tmp;
    }
};

发表于 2022-11-10 21:16:08 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        return n|(m<<j);
    }
};

发表于 2022-10-28 20:52:32 回复(0)
要把n的二进制值插入m的第j位到第i位,只需要把n先左移j位,然
后再进行或运算(|)即可
m: 10000000000
n:  00001001100
     10001001100
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) 
    {
        return n|(m<<j);
    }
};



发表于 2022-10-25 11:43:33 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        while(j--)
        {
            m = m<<1;
        }
        int ret = m^n;
        return ret;
    }
};

发表于 2022-06-14 21:35:15 回复(0)
import java.util.*;

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
            //将m左移j位,移动到要插入的位置,然后按位与就可获得结果
        m <<= j;
        return n | m;
    }
}

发表于 2022-04-04 10:25:30 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        m<<=j;
        return n|m;
    }
};

发表于 2021-09-27 21:08:16 回复(0)
class BinInsert {
public:
    int binInsert(int n, int m, int j, int i) {
        // write code here
        bitset<32> nb(n), mb(m);
        int idx = 0;
        for (int p = j; p <= i; ++p) {
            nb.set(p, mb[idx++]);
        }
        return nb.to_ulong();
    }
};

发表于 2020-06-27 11:54:44 回复(0)