位操作修改位以包括数字

时间:2014-12-06 12:47:20

标签: java bit-manipulation bit bit-shift

我正在学习面试,我一直试图理解这个问题几个小时:

  

您将获得两个32位数字,N和M,以及两个位位置,i   和j。编写一种方法,将N和j之间的所有位设置为N等于M.   (例如,M成为位于i的N的子串,从j开始。)

有人可以提供一个完整的例子,并了解实际需要的内容吗?我需要在i和j之间设置M的值,还是实际M中的位?

是否有一些关于位操作的好教程解释了这些概念?

谢谢!

2 个答案:

答案 0 :(得分:2)

假设这2个32位数字是: -

M = "00010101010101010101010101010101";
N = "10101010100001010101100101011111";
i = 13;
j = 23;

他们只是希望你让N的第13到第23位与M中的相同。

我正在计算右手边的位置。

                                             23rd bit  13th bit

所以,在这里,M的第13至第23个字符=“000101010_____ 10101010101 ___ 010101010101”;

is the mid-spaced 10101010101.

因此,N必须是101010101___ 10101010101 _____100101011111

N = 101010101 "10101010101" 100101011111

答案 1 :(得分:2)

可以使用“masking

来实现
  • 为位置i到j创建一个掩码,每个位使用按位或递增方式设置为1
  • 使用掩码
  • 的按位AND和按位NOT消隐N中的位
  • 使用按位AND和
  • 的掩码从M中选择位
  • 使用按位OR复制位

我知道我在我的例子中使用了十六进制,但同样的原则适用,只是更容易阅读。

实施例

int n = 0x12345678;
int m = 0x55555555;

int i = 4; // assume right to left
int j = 15;

int mask = 0;
for (int pos = i; pos <= j; pos++) {
    mask = mask | (1 << pos);
}
System.out.println(String.format("mask is     0x%08x", mask));

int nCleared = n & ~mask;
System.out.println(String.format("clear n     0x%08x", nCleared));

int bitsFromM = (m & mask);
System.out.println(String.format("Bits from m 0x%08x", bitsFromM));

int nWithM = bitsFromM | nCleared;
System.out.println(String.format("n with m    0x%08x", nWithM));

输出

mask is     0x0000fff0
clear n     0x12340008
Bits from m 0x00005550
n with m    0x12345558