Cracking the coding interview--Q5.1
来源:互联网 发布:闪电网络何时上线 编辑:程序博客网 时间:2024/06/10 04:21
原文:
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; // 全为1int 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
0 0
- Cracking the coding interview--Q5.1
- Cracking the coding interview--Q5.1
- Cracking the coding interview--Q5
- Cracking the coding interview--Q5.2
- Cracking the coding interview--Q5.3
- Cracking the coding interview--Q5.4
- Cracking the coding interview--Q5.5
- Cracking the coding interview--Q5.6
- Cracking the coding interview--Q5.7
- Cracking the coding interview--Q5.2
- Cracking the coding interview--Q5.3
- Cracking the coding interview--Q5.5
- Cracking the coding interview--Q5.6
- Cracking the coding interview--Q5.7
- Cracking the Coding Interview
- 《Cracking the coding interview》
- Cracking The Coding Interview
- Cracking the coding interview
- 拓扑排序
- Winform开发框架之插件化应用框架实现
- linux(debian)固定IP的设置
- 【总结】手机图片预览插件photoswipe使用总结
- Android 自定义view(二) 如何实现自定义组件
- Cracking the coding interview--Q5.1
- 弹出窗口访问父窗口
- UVa 12108 - Extraordinarily Tired Students
- Java中的byte[]数据类型与其他各类数据类型的转换
- QT的Graphics View柜架(1/3)
- Linux常用端口汇总
- Maven:Maven 入门
- OpenCV——Delaunay三角剖分
- hdu3342