我被要求解决以下问题:
给定两个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 i和j表示最低有效位。这是合理的。现在你有
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。