位运算修改位以包含数字

3
我正在准备面试,尝试理解这个问题已经好几个小时了: 你有两个32位数字N和M,以及两个位位置i和j。编写一种方法将N中i和j之间的所有位设置为M(例如,M成为位于i处并从j开始的N的子字符串)。是否需要将i和j之间的位设置为形成M的值,还是实际上是将M中的位设置为相应的位? 是否有一些很好的位操作教程可以解释这些概念? 谢谢!

2
这是一个非常糟糕措辞的问题。 - Alan Stokes
对不起,我在Stackoverflow上还是个初学者! - SummerCode
2
我不是指你的问题 - 我是指你所得到的问题。你的问题比他们的好多了! - Alan Stokes
我的回答是否涵盖了您想知道的所有内容? - Adam
是的,非常感谢! - SummerCode
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

2
可以使用“掩码”来实现:
  • 使用按位OR逐步为位置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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接