位操作修改位以包含数字



我正在为面试做准备,几个小时以来我一直在试图理解这个问题:

给你两个 32 位数字,N 和 M,以及两个位位置,i 和J.编写一个方法,将 N 中 i 和 j 之间的所有位设置为等于 M (例如,M 成为位于 i 处并从 j 开始的 N 的子字符串)。

有人可以举一个完整的例子并了解实际需要什么吗?我是否需要设置 i 和 j 之间的值来形成 M 的值,或者实际上是 M 中的位?

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

谢谢!

可以使用"屏蔽"来实现

  • 使用按位 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

假设这 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.

最新更新