LintCode 更新二进制位

LintCode    更新二进制位

给出两个32位的整数N和M,以及两个二进制位的位置i和j。写一个方法来使得N中的第i到j位等于M(M会是N中从第i为开始到第j位的子串)

样例

给出N = (10000000000)2,M = (10101)2, i = 2, j = 6

返回 N = (10001010100)2

思路分析:首先将给出的整数转换为二进制的形式,可以用两个32位的数组m,n分别存储转换的二进制。然后m数组的相应位替换掉n数组的相应位。再将替换之后的数组m'转换为整数。在转换的过程中注意正负数的不同。对于正数,最高位m'[31]为0,正数M‘ = 2^0 * m'[0]  +  2^1 * m'[1] +  +  2^2 * m'[2]  +  ……+ 2^31 * m'[31]。而对于负数,负数M‘ = -{2^0 * (1 - m'[0])  +  2^1 *(1 -  m'[1] )+  +  2^2 *(1 -  m'[2])  +  ……+ 2^31 * (1 - m'[31])} - 1。代码如下:


    public int updateBits(int n, int m, int i, int j) {
        // write your code here
        byte[] arrm = new byte[32];
        byte[] arrn = new byte[32];
        int sum = 0;
        
        for(int k = 0; k <= 31; k++) {
        	arrm[k] = (byte) (m & 1);
        	arrn[k] = (byte) (n & 1);
        	m>>=1;
        	n>>=1;
        }
        for(int x = i; x <= j; x++)
        	arrn[x] = arrm[x - i];
        
        for(int l = 0; l < 32; l++) {
        	if(arrn[l] == 1 && arrn[31] == 0)
        		sum += Math.pow(2, l);
        	if(arrn[l] == 0 && arrn[31] == 1)
        	    sum += Math.pow(2, l);
        }
        if(arrn[31] == 1) return - sum - 1;
        return sum;    
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值