Cracking the coding interview--Q5.1

原文:

You are given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits between i and j in N equal to M (e.g., M becomes a substring of N located at i and starting at j).

EXAMPLE:

Input: N = 10000000000, M = 10101, i = 2, j = 6

Output: N = 10001010100

译文:

给定两个32位的数,N和M,还有两个指示位的数,i和j。 写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的第i位和第j位之间)

例子:

输入: N = 10000000000, M = 10101, i = 2, j = 6

输出: N = 10001010100


方法一:

先把n的低位0~i-1保留下来ret中,然后把n低位0~j清零,使得n低位为0,此时把m左移i位然后或n,测试n中i~j位已经为m数据,

最后再把n和ret或运算,恢复n低位数据,

代码如下:


package chapter_5_BitManipulation;

import java.util.Scanner;

/**
*
* 	给定两个32位的数,N和M,还有两个指示位的数,i和j。 写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的第i位和第j位之间)
	输入: N = 10000000000, M = 10101, i = 2, j = 6
	输出: N = 10001010100
* 
*/
public class Question_5_1 {
	
	/**
	 * @param n
	 * @param m
	 * @param i
	 * @param j
	 * 
	 * 输入: N = 10000000000, M = 10101, i = 2, j = 6
	 * 输出: N = 10001010100
	 * 
	 */
	public static int update_bits(int n, int m, int i, int j) {
		// 保留n低位0-i在ret中
		int ret = (1<<i) - 1;
		ret &= n;
		// 获取m数据至n中
		// 修改n中低0-j为0,再或运算m移位后的
		int mid = ((n>>(j+1)) << (j+1)) | (m<<i);
		// 恢复n低位ret数据
		return mid | ret;
	}
	
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		String str3[] = string.split(" ");
		
		int n = Integer.parseInt(str3[0]);
		int m = Integer.parseInt(str3[1]);
		int i = Integer.parseInt(str3[2]);
		int j = Integer.parseInt(str3[3]);
		
		int result = update_bits(n, m, i , j);
		System.out.println("result n =" + result);
	}
}

方法二:

用一个左边全为1,中间一段全为0(这段的长度与m长度一样), 右边全为1的掩码mask去和n按位与,得到的值是将n中间一段清0的结果。 然后再与m左移i位后按位或,得到最终结果。

代码如下:

package chapter_5_BitManipulation;

import java.util.Scanner;

/**
 *
 * 	给定两个32位的数,N和M,还有两个指示位的数,i和j。 写程序使得N中第i位到第j位的值与M中的相同(即:M变成N的子串且位于N的第i位和第j位之间)
	输入: N = 10000000000, M = 10101, i = 2, j = 6
	输出: N = 10001010100
 * 
 */
public class Question_5_1_2 {
	
	public static int update_bits2(int n, int m, int i, int j) {
		int mid = ~0; // 全为1
		int left = mid - ((1<<(j+1)) - 1);
		int right = 1<<i-1;
		int ret = left | right;
		return (ret & n) | (m << i);
	}
	
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		String string = scanner.nextLine();
		String str3[] = string.split(" ");
		
		int n = Integer.parseInt(str3[0]);
		int m = Integer.parseInt(str3[1]);
		int i = Integer.parseInt(str3[2]);
		int j = Integer.parseInt(str3[3]);
		
		int result = update_bits2(n, m, i , j);
		System.out.println("result n =" + result);
	}
}


参考自:http://www.hawstein.com/posts/5.1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值