java新知识:10000000000中I和j之间的位是多少?



我被要求解决以下问题:

给定两个32位数字N和M,以及两个位位置i和j。编写一个方法将N中i和j之间的所有位设置为M(例如,M成为N的子串,位于i,从j开始)。例子:输入:N = 10000000000, M = 10101, i = 2, j = 6输出:N = 10001010100

我不明白的是,10000000000中I和j之间的位是多少?你能给我解释一下吗?

我熟悉位运算,但是这完全把我搞糊涂了。

从这个例子中,看起来比特是从右到左编号的,从0开始:

N             1 0 0 0 0 0 0 0 0 0 0
Position #   10 9 8 7 6 5 4 3 2 1 0
                      ^       ^                      
                     j=6     i=2
                      _______/
                          |
                  These are the bits
                 between i and j in N.

N中的每一位数字为1位。从最右边的0开始,数数字并移动i个数字。这就是你要找的部分的开始。对j做同样的处理,就这样了。i和j之间的子字符串是要替换的位

要设置位,您可以将其OR为值。

要删除/0位,可以将其从值中取出。

所以我们假设low ij表示最低有效位。这是合理的。

现在你有

N = 10000000000
j = 6 --^   ^--  i = 2
M = 10101

首先将bit i设置为m中最小位0的值。

要设置N中的第2位,就像M中的第0位一样,只需

int bitToSet = 1<<i; // value of least bit i
if ( M % 2 == 1 ) // least bit is set
   N = N | bitToSet;
else
   N = N | ~bitToSet; // negate to remove
M /= 2; // move up to next higher bit

冲洗并重复j

最新更新